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

时间:2014-03-20 14:30:55

标签: java mongodb mongodb-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" } ] 
}

现在,我想将ba主机中id=1的{​​{1}}更新为name=Host 1。更新后,结果将是

{   "wwn" : "AA:BB:CC:DD",  "id" : "11" }

为此,我使用了mongo shell命令

{ "_id"   : ObjectId("532aeec040a83df82181ff3c"), 
   "os"   : "WINDOWS", 
   "name" : "Host 1", 
   "bas" : [     
              {   "wwn" : "AA:BB:CC:DD",  "id" : "11" },   
              {   "wwn" : "AA:00:11:BB",  "id" : "2" } ] 
}
效果很好。现在我想用Java驱动程序做同样的事情,这是我的代码

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

在上面的代码中,我必须将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替换为$以避免异常被抛出。此更新调用未更新集合。当我查看\u0024时,JSON与我在控制台上输入的内容相同。请帮帮我。

2 个答案:

答案 0 :(得分:2)

我不明白为什么你需要写$.作为Unicode转义。我尝试使用其中的实际字符运行代码,并且它与2.11 Java驱动程序一起工作正常。

但是您的代码有两个问题:1)句号.\u002e,而不是\uff0e,这是一个非常不同的字符。 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"))) ;

答案 1 :(得分:0)

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

如果您的值对象没有以$开头的键,那么它将检查嵌入的文档中是否存在非法字符。你可以发布有这个问题的原始代码,没有逃脱吗?