簡體   English   中英

$ set和位置運算符在Java中不起作用?

[英]$set and positional operator doesn't work in Java?

我在MongoDb集合中有以下稱為hosts文檔

{ "_id"   : ObjectId("532aeec040a83df82181ff3c"), 
   "os"   : "WINDOWS", 
   "name" : "Host 1", 
   "bas" : [     
              {   "wwn" : "EE:00:11:FF",  "id" : "1" },   
              {   "wwn" : "AA:00:11:BB",  "id" : "2" } ] 
}

現在,我想將name=Host 1 Host中id=1 ba更新為{ "wwn" : "AA:BB:CC:DD", "id" : "11" } 更新后的結果將是

{ "_id"   : ObjectId("532aeec040a83df82181ff3c"), 
   "os"   : "WINDOWS", 
   "name" : "Host 1", 
   "bas" : [     
              {   "wwn" : "AA:BB:CC:DD",  "id" : "11" },   
              {   "wwn" : "AA:00:11:BB",  "id" : "2" } ] 
}

為此,我使用了mongo shell命令

db.hosts.update( { name : "Host 1", "bas.id" : "1" }, 
 { "$set" : { "bas.$" : { wwn : "AA:BB:CC:DD", id : "11"} }} );

效果很好 現在我想使用Java驅動程序做同樣的事情,這是我的代碼

BasicDBObject example = new BasicDBObject("name", "Host 1").append("bas\uff0eid", "1");
BasicDBObject newValue = new BasicDBObject("\u0024set",  new BasicDBObject("bas\uff0e\u0024", new BasicDBObject().append("wwn", "AA:BB:CC:DD).append("id","11")) ;
collection.update(example, newValue);

在上面的代碼中,我不得不替換. 使用\\uff0\u003c/code>和$使用\$以避免拋出異常。 此更新調用不會更新集合。 當我檢查BasicDBObject.toString() ,JSON與我在控制台上鍵入的JSON相同。 請幫我。

我不明白您為什么需要寫$. Unicode轉義。 我嘗試使用您的實際字符運行您的代碼,並且在2.11 Java驅動程序中運行良好。

但是您的代碼有兩個問題:1)句號. \. ,而不是\. ,這是一個非常不同的字符。 2)語句最后部分的語法不正確,但這很可能是復制錯誤。

這是我使用的代碼,並且運行良好(我只創建了對象,實際上並未在數據庫上運行它,但是我不明白為什么這不起作用)。

    BasicDBObject example = new BasicDBObject("name", "Host 1").append("bas.id", "1");
    BasicDBObject newValue = new BasicDBObject("$set",
                               new BasicDBObject("bas.$",
                                 new BasicDBObject()
                                   .append("wwn", "AA:BB:CC:DD").append("id","11"))) ;

https://github.com/mongodb/mongo-java-driver/blob/master/src/main/com/mongodb/DBCollectionImpl.java#L249

如果您的值對象沒有以$開頭的鍵,則它將檢查嵌入文檔中是否包含非法字符。 您是否可以在沒有轉義的情況下發布具有此問題的原始代碼?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM