我在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与我在控制台上输入的内容相同。请帮帮我。
答案 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)
如果您的值对象没有以$开头的键,那么它将检查嵌入的文档中是否存在非法字符。你可以发布有这个问题的原始代码,没有逃脱吗?