Mongodb更新到子数组文档

时间:2015-04-14 17:20:25

标签: mongodb

我有一个结构

{
        "_id" : ObjectId("562dfb4c595028c9r74fda67"),
        "office_id" : "123456",
        "employee" : [
                {
                        "status" : "declined",
                        "personId" : "123456",
                        "updated" : NumberLong("1428407042401")
                }
        ]
}

这个办公室可以有多个人。如果我想更新该特定office_id下的所有人的员工状态,请说明"批准"。我正在尝试通过普通的mongo java我正在尝试的是使用查询构建器获取所有办公室ID,然后遍历列表并保存文档。我不满意我正在遵循的迭代方法(获取,迭代和保存)。请建议如果有其他方式。

1 个答案:

答案 0 :(得分:3)

您可以使用$ positional operator

进行更新
db.collection.update(
    {
        "office_id" : "123456", 
        "employee.status": "declined"
    }, 
    {
        "$set": { "employee.$.status": "approved" }
    }
);

位置运算符从匹配查询的数组中保存元素的索引(在上面的情况下为0)。这意味着如果您事先知道元素的位置(在现实生活中几乎不可能),您只需将更新语句更改为:{"$set": {"employee.0.status": "approved"}}

请注意,$位置操作员(暂时)仅更新第一个相关文档,此处有 JIRA 票证。

修改

使用Java驱动程序,上述更新可能就像这样(未经测试):

BasicDBObject update = new BasicDBObject();
BasicDBObject query = new BasicDBObject();
query.put("office_id", "123456");
query.put("employee.status", "declined");

BasicDBObject set = new BasicDBObject("$set", update);
update.put(""employee.$.status", "approved");

collection.update(query, set);