繁体   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