Java 是一种非常冗长的语言,有时最简单的方法是首先使用 JS shell 编写查询,确保它按预期执行,然后将其翻译成 Java。
通过将 System.out.println(account.toString()) 添加到您的 Java 代码中,我可以看到您的更新文档如下所示,这是无效的:
{ "$set" : { "status" : 0} , "pos.X" : "90.45" , "pos.Y" : "90.45" , "pos.Z" : "90.45"}
从您的问题来看,您希望更新后的文档看起来像什么并不完全清楚,但我猜您想修改“status”和“pos.0.X”、“pos.1”的值。 Y”和“pos.2.Z”。因为 X、Y 和 Z 都作为单独的嵌入文档存储在数组中,所以必须通过它们的位置来引用它们才能同时更新。如果可能,您可能会发现最好重新排列文档结构,使 X、Y 和 Z 都存储在同一个文档中,如下所示:
"pos" : {
"X" : "0",
"Y" : "0",
"Z" : "0"
}
这样,您将能够使用点符号 pos.X、pos.Y、pos.Z 更轻松地访问每个变量,从您的帖子中看起来就像您想要的那样。更多关于嵌入文档的信息可以在“Dot Notation (Reaching into Objects)”文档中找到:
http ://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29
这是一个将修改上述值的更新语句:
> db.pseudo.find({ "pseudo" : "gPlayer"}).pretty()
{
"_id" : ObjectId("4f904ebb5bebd4375b759c90"),
"email" : "email",
"password" : "password",
"pos" : [
{
"X" : "90.45"
},
{
"Y" : "90.45"
},
{
"Z" : "90.45"
}
],
"pseudo" : "gPlayer",
"status" : "1"
}
> db.pseudo.update({"pseudo" : "gPlayer"}, { "$set" : { "status" : 0 , "pos.0.X" : "0" , "pos.1.Y" : "0" , "pos.2.Z" : "0"}})
> db.pseudo.find({ "pseudo" : "gPlayer"}).pretty()
{
"_id" : ObjectId("4f904ebb5bebd4375b759c90"),
"email" : "email",
"password" : "password",
"pos" : [
{
"X" : "0"
},
{
"Y" : "0"
},
{
"Z" : "0"
}
],
"pseudo" : "gPlayer",
"status" : 0
}
>
翻译成Java是:
BasicDBObject change = new BasicDBObject("pseudo", "gPlayer");
BasicDBObject setDoc = new BasicDBObject();
setDoc.append("status", "0");
setDoc.append("pos.0.X", "0");
setDoc.append("pos.1.Y", "0");
setDoc.append("pos.2.Z", "0");
BasicDBObject account = new BasicDBObject("$set", setDoc);
coll.update(change, account);
我意识到我对您想要执行的更新的确切猜测有点猜想,但希望以上内容能让您指出正确的方向!