【问题标题】:Mongodb - Update multiple array element inside JSON arrayMongodb - 更新JSON数组中的多个数组元素
【发布时间】:2013-12-23 20:01:53
【问题描述】:

我有一个收藏文档,例如。

{'_id':1,
             'name':'Root',
             'taskId':1,
             'parentId':"",
             'path':[1],
             'tasks':[  {"taskId":3,parentId:1,name:'A',status:'Created'},
                        {"taskId":4,parentId:1,name:'D',status:'Created'},
                        {"taskId":5,parentId:4,name:'B',status:'Created'},
                        {'type':'project' , 'proRef':2},
                        {"taskId":6,parentId:3,name:'E',status:'Started'},
                        {"taskId":7,parentId:6,name:'C',status:'Stopped'}]

            }

现在我想将多个数组元素字段“状态”更新为 JSON 中的“已删除”。让我们假设 taskId 3,4 我需要将状态更新为已删除。我已经用 $in 和 query($) 尝试过这个查询,但它更新的第一个元素只是 $in 数组。在下面的查询中,只有 3 的 taskId 得到更新,而不是 4。

db.projectPlan.update({"_id": 1,'tasks.taskId': {$in :[3,4]}} , {$set: {'tasks.$.status': 'Deleted'}}, {upsert: false, multi: true});

如何在单个查询中更新多个元素。提前致谢!!

【问题讨论】:

  • 这在@Gergo 的回答中是不可能的。您的架构建议您正在查看某种项目管理/计划工具,在这种情况下,您可能希望将任务放在单独的集合中,因为有许多用例您希望单独查询任务(任务分配给 X,状态为 Y 的任务等)

标签: arrays json mongodb


【解决方案1】:

恐怕不可能,这是MongoDB的限制。来自文档(http://docs.mongodb.org/manual/reference/operator/update-array/):

$ 充当占位符以更新第一个匹配的元素 更新中的查询条件。

更多详情请看这张票:https://jira.mongodb.org/browse/SERVER-1243

虽然在 MongoDB shell 中是可能的:

db.projectPlan.find({"_id": 1}).forEach(function(plan) {
  plan.tasks.forEach(function(task) {
    if(task.taskId in { 3: 1, 4: 1 }) {
      task.status = "Deleted";
    }
  });
  db.projectPlan.save(plan);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2013-09-07
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多