【问题标题】:Mongo DB Update to a sub array documentMongodb 更新到子数组文档
【发布时间】:2015-04-15 02:53:21
【问题描述】:

我有一个结构

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

这个办公室可以有多个人。如果我想更新该特定 office_id 下所有人员的员工状态以说“已批准”,有没有办法。我正在通过普通的 mongo java 驱动程序尝试相同的方法。我是什么尝试使用查询生成器获取所有办公室 ID,然后遍历列表并保存文档。我对我正在遵循的迭代方法(获取、迭代和保存)有些不满意。请建议是否有替代方法.

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您可以使用$ 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);
    

    【讨论】:

      猜你喜欢
      • 2016-12-31
      • 2017-08-22
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 2016-11-23
      • 2015-03-30
      相关资源
      最近更新 更多