如何在MongoDB的数组数组中更新对象的字段?

时间:2020-02-06 04:05:48

标签: node.js mongodb mongodb-query

我的mongodb数据是这样的,由于数组中的数组有点复杂。

{
"_id" : ObjectId("5e36950f65fae21293937594"),
"userId" : "5e33ee0b4a3895a6d246f3ee",
"notes" : [ 
    {
        "noteId" : ObjectId("5e36953665fae212939375a0"),
        "time" : ISODate("2020-02-02T17:24:06.460Z"),
        "memoryLine" : [ 
            {
                "_id" : ObjectId("5e36953665fae212939375ab"),
                "memoryTime" : ISODate("2020-02-03T17:54:06.460Z"),
                "hasReviewed": false
            }, 
            {
                "_id" : ObjectId("5e36953665fae212939375aa"),
                "memoryTime" : ISODate("2020-02-03T05:24:06.460Z"),
                "hasReviewed": false
            }
        ]
    }
]}

我想用_id更新memoryLine中的hasReviewed。例如,我想将_id:ObjectId(5e36953665fae212939375ab)项目的 hasReviewed 更新为 true 。如预期的那样:

{
"_id" : ObjectId("5e36950f65fae21293937594"),
"userId" : "5e33ee0b4a3895a6d246f3ee",
"notes" : [ 
    {
        "noteId" : ObjectId("5e36953665fae212939375a0"),
        "time" : ISODate("2020-02-02T17:24:06.460Z"),
        "memoryLine" : [ 
            {
                "_id" : ObjectId("5e36953665fae212939375ab"),
                "memoryTime" : ISODate("2020-02-03T17:54:06.460Z"),
                "hasReviewed": true    <============here updated to true
            }, 
            {
                "_id" : ObjectId("5e36953665fae212939375aa"),
                "memoryTime" : ISODate("2020-02-03T05:24:06.460Z"),
                "hasReviewed": false
            }
        ]
    }
]}

如何处理?谢谢。

2 个答案:

答案 0 :(得分:1)

您可以在.updateOne()中使用 arrayFilters 来做到这一点:

db.collection.update({ 'notes.memoryLine._id': ObjectId("5e36953665fae212939375ab") },
    { $set: { "notes.$[].memoryLine.$[element].hasReviewed": true } },
    { arrayFilters: [{ "element._id": ObjectId("5e36953665fae212939375ab") }] })

注意::由于 memoryLine notes 数组对象内部的数组,因此此notes.$[]将更新所有对象 memoryLine.hasReviewed 更改为 true ,否则,如果您只想更新第一个匹配的对象,则可以使用notes.$。另外,您可以使用.updateOne()代替.updateMany()来更新多个文档。

答案 1 :(得分:0)

我为此找到了解决方案。

db.notes.updateOne({
    userId:"5e33ee0b4a3895a6d246f3ee",
    'notes.0.memoryLine._id': ObjectId("5e36953665fae212939375ab"),
}, {
    '$set': {
        'notes.0.memoryLine.$.hasReviewed': true
    }
});