“存储在数据库中的字段不能包含。”

时间:2014-03-18 15:21:07

标签: mongodb mongodb-java

我尝试重写这个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
    }]
}]

我想我真的错过了什么......

1 个答案:

答案 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"的数组,只会更新第一个元素。