【问题标题】:Update field in double nested arrays with Mongoose [duplicate]使用 Mongoose 更新双嵌套数组中的字段 [重复]
【发布时间】:2016-08-17 23:20:44
【问题描述】:

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

{
    "_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
                }
            ]
        }
    ]
}

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

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

    来自documentation

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

    更多信息请参见this issue

    【讨论】:

    • 最后我在回调中做了我需要的事情,使用 forEach 查找嵌套数组元素并更新它
    【解决方案2】:

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

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

    【讨论】:

    • 我试过这个 User.update( {_id: Mongoose.Types.ObjectId(userId), 'projects.tasks._id': Mongoose.Types.ObjectId(data.task._id) } , { $set: { 'projects.tasks.$.completed': data.task.completed }}, (err, data) => { console.log(data); return reply('success'); } );但作为回报,我得到了 { ok: 0, n: 0, nModified: 0 }
    • 可能会发生很多原因。不太确定。我建议您应该首先在您的 mongoshell 中尝试此操作(正确查找 _id 或尝试其他字段而不是 _id)。您也可以在更新时将另一个属性添加到第一个参数中。像'projects._id':'1'。
    • 或者问题可能出在您的字段类型上。如果您的“已完成”是布尔值并且您发送字符串字段,则 mongo 不允许修改该字段。正如我所说,你必须先尝试你的 mongo shell。
    • 这根本行不通。位置运算符不适用于多重嵌套数组,如 panjan 的回答中所述。
    猜你喜欢
    • 2017-07-05
    • 2018-07-12
    • 2016-05-03
    • 2021-01-10
    • 2017-01-24
    • 2018-10-10
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多