我尝试重写这个mongodb查询(在命令行中运行):
db.projects.update({"tools.name" : "gitlab"}, {"$set" : {"tools.$.status" : "error"}})
在java中:
DBObject queryUpdate = new BasicDBObject("tools.name", "gitlab");
queryUpdate.put("$set", new BasicDBObject("tools.$.status", "error"));
projects.update(null, queryUpdate, false, true);
如果工具名称是“gitlab”,我需要更新每个状态。
我的收藏看起来像这样(我只放了一个文件进行测试):
[{
_id: {
$oid: "531f0e4dd14c366cef214fe7"
},
tools:[
{
name: "gitlab",
url: "https://url/",
status: "success",
selected: true
}, {
name: "svn",
url: "https://url/",
status: "error",
selected: true
}]
}]
我想我真的错过了什么......
答案 0 :(得分:1)
默认情况下,更新查询仅更新一个文档(第一个匹配)。您需要将multi标志设置为true。
此语句中的更新查询也不正确。你应该试试:
DBObject querySelect = new BasicDBObject("tools.name", "gitlab");
DBObject queryUpdate = new BasicDBObject("$set", new BasicDBObject("tools.$.status", "error"));
projects.update(querySelect, queryUpdate, false, true);
注意: $位置运算符仅匹配数组中的第一个元素。所以,如果你在"工具中有多个元素"名为=" gitlab"的数组,只会更新第一个元素。