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を使う方法は?
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          ,         ,,