mongodb 3.4データの更新java.lang.IllgalAgment Exception:Invalid BSON field name age
12040 ワード
mongodbはudateOneとudateManyを使ってもいいです.方式が間違っています.
ここ数日はモンゴルdbを勉強しています.モンゴルdb-client shell命令を使ってjavaを使ってみたいです.
monogo Collection.udateOneを使うとエラーが発生します.
mongo Collection.replace Oneはエラーがないです.
ネットで検索しましたが、ネットで見つけた答えは?
」分析:
公式のudate戦略に変化があるはずです.3.0以前にudateOneを使い、3.0以降はreplace Oneを使います.
解決策:
udateOneをreplace Oneに置き換えればいいです」
これは分かりにくいです.もし使うことを勧めないなら、なぜ直接廃棄しないのですか?@deprecatedという注釈を使わないです.
存在は合理的で、利用できると思います.
だから私は断点を使って長い間探しました.
shell命令udateOneを使う方法は?
{_id}:ObjectId(「591 bf 047 b 5 b 733 b 38 d 063745」)、「name」:「zhaoliu」、「age」:「21」)
>
>db.testMongo.udate({name:'zhaoliu')、{set:''1000'})
WriteResult(「nMatch」:1、「nUpsperted」:0、「nModified」:1))
>db.testMongo.find({name:'zhaoliu')
{_id}:ObjectId(「591 bf 047 b 5 b 733 b 38 d 063745」)、「name」:「zhaoliu」、「age」:「1000」)
>
shellはそうです.
なぜjavaコードがだめですか?
Disconnected from the target VM,address:'127.1.0.1:52998',transport:'socket'
java.lang.IllagalAgment Exception:Invalid BSON field name age
at org.bson.AbstractBson Writer.writeName(AbstractBson Writer.java:516)
at org.bson.co decs.DocmentCodec.writeMap(DocomntCodec.java:188)
at org.bson.co decs.DocmentCodec.encode(Dcument Codec.java:131)
at org.bson.co decs.DocmentCodec.encode(DocmentoCodec.java:45)
at org.bson.co decs.Bson DocmentWrapper Codec.encode(Bson Docment WrapperCodec.java:63)
at org.bson.co decs.Bson DocmentWrapper Codec.encode(Bson Docment WrapperCodec.java:29)
at comp.mongodb.co.nnections.UpdateCommand Message.writeThe Writes(UpdateCommand Message.java:85)
at comp.mongodb.co.nnections.UpdateCommand Message.writeThe Writes(UpdateCommand Message.java:43)
at common.mongodb.com nnections.BaseWriteCommand Message.encodeMessage Body WithMetadata(BaseWriteCommand Message.java:129)
at common.mongodb.co ections.Request Message.encodeWithMetadata(Request Message.java:160)
at common.mongodb.co.nnections.WriteCommand Protocol.sendMessage(WriteCommand Protocol.java:220)
at comp.mongodb.co.nnections.WriteCommand Protocol.execute(WriteCommand Protocol.java:101)
at comp.mongodb.co.nnections.UpdateCommand Protocol.execute(UpdateCommand Protocol.java:64)
at comp.mongodb.co.nnections.UpdateCommand Protocol.execute(UpdateCommand Protocol.java:37)
at common.mongodb.co.nnections.Default Server$Default Server Protocol Exector.execute(Default Server.java:168)
at common.mongodb.co.nnections.Default ServerConnection.execute Protocol(Default ServerConnection.java:289)
at common.mongodb.co.nnections.Default Server Connection.udateCommmand(Default ServerConnection.java:143)
at common.mongodb.operation.MixedBulkWriteOperation$Run$3.executeWriteCommandProtocol(MixedBultWriteOperation.java:490)
at common.mongodb.operation.MixedBulkWriteOperation$Run Exector.execute(MixedBulkWriteOperation.java:656)
at common.mongodb.operation.MixedBulkWriteOperation$Run.execute(MixedBulkWriteOperation.java:409)
at common.mongodb.operation.MixedBulkWriteOperation$1.cal(MixedBulkWriteOperation.java:177)
at common.mongodb.operation.MixedBulkWriteOperation$1.cal(MixedBulkWriteOperation.java:168)
at common.monogodb.operation.Helper.withConnection Source(Operation Helper.java:422)
at common.monogodb.operation.Helper.withConnection(Operation Helper.java:413)
at common.mongodb.operation.MixedBultWriteOperation.execute(MixedBulkWriteOperation.java:168)
at common.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:74)
at common.mongodb.Mongo.execute(Mongo.java:845)
at common.mongodb.Mongo$2.execute(Mongo.java:828)
at common.mongo Collection Impl.executeSingleWriteRequest(Mongo Collection Impl.java:550)
at comple.mongodb.Mongo Collection Impl.udate(Mongo Collection Impl.java:542)
at comple.mongodb.Mongo Collection Impl.udateOne(Mongo Collection Impl.java:381)
at comple.mongodb.Mongo Collection Impl.udateOne(Mongo Collection Impl.java:376)
at comp.project.mongodbUtils.testMongodbUpdateOneOther(MongodbUtils.java:136)
at comp.project.mongodb.MongodbUtils.main(MongodbUtils.java:174)
なぜclientは$setという修饰符を使ったのかと思いますが、javaにはなぜないですか?
私はデバッグの時にこのようなコードを発見しました.
ここ数日はモンゴルdbを勉強しています.モンゴルdb-client shell命令を使ってjavaを使ってみたいです.
monogo Collection.udateOneを使うとエラーが発生します.
mongo Collection.replace Oneはエラーがないです.
ネットで検索しましたが、ネットで見つけた答えは?
」分析:
公式のudate戦略に変化があるはずです.3.0以前にudateOneを使い、3.0以降はreplace Oneを使います.
解決策:
udateOneをreplace Oneに置き換えればいいです」
これは分かりにくいです.もし使うことを勧めないなら、なぜ直接廃棄しないのですか?@deprecatedという注釈を使わないです.
存在は合理的で、利用できると思います.
だから私は断点を使って長い間探しました.
shell命令udateOneを使う方法は?
db.collection.updateOne(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>
}
)
>db.testMongo.find({name:'zhaoliu'){_id}:ObjectId(「591 bf 047 b 5 b 733 b 38 d 063745」)、「name」:「zhaoliu」、「age」:「21」)
>
>db.testMongo.udate({name:'zhaoliu')、{set:''1000'})
WriteResult(「nMatch」:1、「nUpsperted」:0、「nModified」:1))
>db.testMongo.find({name:'zhaoliu')
{_id}:ObjectId(「591 bf 047 b 5 b 733 b 38 d 063745」)、「name」:「zhaoliu」、「age」:「1000」)
>
shellはそうです.
なぜjavaコードがだめですか?
public void testMongogUpdateOne(){
MongoDatabase database = MongodbUtils.getDatabase("testMongo");
MongoCollection mongoCollection = database.getCollection("testMongo");
Document document = new Document("name", "zhaoliu");
Document documentNew = new Document("name", "aaa").append("age", 21);
mongoCollection.replaceOne(document, documentNew);
}
replace Oneは成功を実行することができます.public void testMongogUpdateOne(){
MongoDatabase database = MongodbUtils.getDatabase("testMongo");
MongoCollection mongoCollection = database.getCollection("testMongo");
Document document = new Document("name", "zhaoliu");
Document documentNew = new Document("name", "aaa").append("age", 21);
mongoCollection.updateOne(document, documentNew);
}
udateOneを使います いけませんDisconnected from the target VM,address:'127.1.0.1:52998',transport:'socket'
java.lang.IllagalAgment Exception:Invalid BSON field name age
at org.bson.AbstractBson Writer.writeName(AbstractBson Writer.java:516)
at org.bson.co decs.DocmentCodec.writeMap(DocomntCodec.java:188)
at org.bson.co decs.DocmentCodec.encode(Dcument Codec.java:131)
at org.bson.co decs.DocmentCodec.encode(DocmentoCodec.java:45)
at org.bson.co decs.Bson DocmentWrapper Codec.encode(Bson Docment WrapperCodec.java:63)
at org.bson.co decs.Bson DocmentWrapper Codec.encode(Bson Docment WrapperCodec.java:29)
at comp.mongodb.co.nnections.UpdateCommand Message.writeThe Writes(UpdateCommand Message.java:85)
at comp.mongodb.co.nnections.UpdateCommand Message.writeThe Writes(UpdateCommand Message.java:43)
at common.mongodb.com nnections.BaseWriteCommand Message.encodeMessage Body WithMetadata(BaseWriteCommand Message.java:129)
at common.mongodb.co ections.Request Message.encodeWithMetadata(Request Message.java:160)
at common.mongodb.co.nnections.WriteCommand Protocol.sendMessage(WriteCommand Protocol.java:220)
at comp.mongodb.co.nnections.WriteCommand Protocol.execute(WriteCommand Protocol.java:101)
at comp.mongodb.co.nnections.UpdateCommand Protocol.execute(UpdateCommand Protocol.java:64)
at comp.mongodb.co.nnections.UpdateCommand Protocol.execute(UpdateCommand Protocol.java:37)
at common.mongodb.co.nnections.Default Server$Default Server Protocol Exector.execute(Default Server.java:168)
at common.mongodb.co.nnections.Default ServerConnection.execute Protocol(Default ServerConnection.java:289)
at common.mongodb.co.nnections.Default Server Connection.udateCommmand(Default ServerConnection.java:143)
at common.mongodb.operation.MixedBulkWriteOperation$Run$3.executeWriteCommandProtocol(MixedBultWriteOperation.java:490)
at common.mongodb.operation.MixedBulkWriteOperation$Run Exector.execute(MixedBulkWriteOperation.java:656)
at common.mongodb.operation.MixedBulkWriteOperation$Run.execute(MixedBulkWriteOperation.java:409)
at common.mongodb.operation.MixedBulkWriteOperation$1.cal(MixedBulkWriteOperation.java:177)
at common.mongodb.operation.MixedBulkWriteOperation$1.cal(MixedBulkWriteOperation.java:168)
at common.monogodb.operation.Helper.withConnection Source(Operation Helper.java:422)
at common.monogodb.operation.Helper.withConnection(Operation Helper.java:413)
at common.mongodb.operation.MixedBultWriteOperation.execute(MixedBulkWriteOperation.java:168)
at common.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:74)
at common.mongodb.Mongo.execute(Mongo.java:845)
at common.mongodb.Mongo$2.execute(Mongo.java:828)
at common.mongo Collection Impl.executeSingleWriteRequest(Mongo Collection Impl.java:550)
at comple.mongodb.Mongo Collection Impl.udate(Mongo Collection Impl.java:542)
at comple.mongodb.Mongo Collection Impl.udateOne(Mongo Collection Impl.java:381)
at comple.mongodb.Mongo Collection Impl.udateOne(Mongo Collection Impl.java:376)
at comp.project.mongodbUtils.testMongodbUpdateOneOther(MongodbUtils.java:136)
at comp.project.mongodb.MongodbUtils.main(MongodbUtils.java:174)
なぜclientは$setという修饰符を使ったのかと思いますが、javaにはなぜないですか?
私はデバッグの時にこのようなコードを発見しました.
public void writeName(String name) {
if(this.state != AbstractBsonWriter.State.NAME) {
this.throwInvalidState("WriteName", new AbstractBsonWriter.State[]{AbstractBsonWriter.State.NAME});
}
if(name == null) {
throw new IllegalArgumentException("BSON field name can not be null");
} else if(!((FieldNameValidator)this.fieldNameValidatorStack.peek()).validate(name)) {
throw new IllegalArgumentException(String.format("Invalid BSON field name %s", new Object[]{name}));
} else {
this.context.name = name;
this.state = AbstractBsonWriter.State.VALUE;
}
}
そのうちif(!((FieldNameValidator)this.fieldNameValidatorStack.peek()).validate(name))
UpdateFieldNameValidator
public boolean validate(String fieldName) { return fieldName.startsWith("$"); }
$
updateOne
public void testMongodbUpdateOneOther(){ MongoDatabase database = MongodbUtils.getDatabase("testMongo"); MongoCollection
mongoCollection = database.getCollection("testMongo"); Document document = new Document("name", "zhaoliu"); Document modifiers = new Document(); Document documentNew = new Document(); documentNew.append("age", 210); modifiers.append("$set", documentNew); UpdateResult updateResult = mongoCollection.updateOne(document, modifiers); System.out.println(updateResult.getMatchedCount()); }
mongodb , ,,