使用Mongoose更新双嵌套数组中的字段

时间:2016-04-24 16:24:35

标签: mongodb mongoose

使用猫鼬的另一个问题。我想在文档中更新task,如下所示。 例如,我想使用completed _id=1收件箱中的project更新任务中的name字段。 是否可以在一个查询中执行?

{
    "_id" : ObjectId("5702e0c732faf57c7bb9ebe9"),
    "email" : "john@doe.me",
    "projects" : [ 
        {
            "_id" : "1",
            "name" : "inbox",
            "tasks" : [ 
                {
                    "_id" : "1",
                    "text" : "First task",
                    "labels" : [ 
                        "home", 
                        "phone"
                    ],
                    "dueDate" : "2016-03-18T11:10:00",
                    "created" : "2016-03-10T10:10:00",
                    "completed" : true
                }, 
                {
                    "_id" : "2",
                    "text" : "Second task",
                    "labels" : [ 
                        "home", 
                        "phone"
                    ],
                    "dueDate" : "2016-03-18T11:10:00",
                    "created" : "2016-03-10T10:10:00",
                    "completed" : false
                }, 
            ]
        }, 
        {
            "_id" : "2",
            "name" : "work",
            "tasks" : [ 
                {
                    "_id" : "4",
                    "text" : "Fourth",
                    "labels" : [ 
                        "home", 
                        "phone"
                    ],
                    "dueDate" : "2016-03-18T11:10:00",
                    "created" : "2016-03-10T10:10:00",
                    "completed" : false
                }
            ]
        }
    ]
}

2 个答案:

答案 0 :(得分:4)

在Mongo中,无法一次查询和更新嵌套数组。此处需要的位置$运算符不支持遍历嵌套数组。

来自documentation

  

位置$运算符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$ placeholder的替换是单个值

有关详细信息,请参阅this issue

答案 1 :(得分:0)

是的可能。您需要使用位置运算符。请试试这个:

db.yourCollection.update({
        "_id" : ObjectId("5702e0c732faf57c7bb9ebe9"),
        'projects.tasks._id': '1'
      },
      { $set: { 'projects.tasks.$.completed': newData }}
    )