【问题标题】:Update multiple embedded documents in multiple documents in MongoDB更新MongoDB中多个文档中的多个嵌入文档
【发布时间】:2019-09-19 01:30:17
【问题描述】:

我正在尝试使用 nodejs 中的 mongoose 更新 MongoDB 中多个文档中的多个嵌入文档。

该文档的示例如下所示。

如您所见,在 'exampleDocument' 中有一个嵌入文档:'embededDoc'

let exampleDocument =  
    {   
        _id: '1aa',
        player_id: '9pp',
        docUpdated: false',
        embededDoc:
        [ 
            { 
            _id: '3eb',
            embededDocUpdated: false,
            timeDocWasSaved: '2019-04-30T08:45:50.349Z' 
            } 
        ],
    }

如何在多个 'exampleDocument' 文档中更新多个嵌入的 'embededDoc' 文档。

this answer 的帮助下,我知道如何使用一条命令更新多个文档,如下所示:

db.exampleDocument.update(
   { _id: { $in: ['1aa', '2bb', '3cc'] } },
   { $set: { docUpdated : yes } }
)

如果我想通过它们的 id 更新几个嵌入文档(embededDoc)怎么办?

例如,假设我们有三个 'exampleDocument' 文档,其 id 为:'1aa'、'2bb'、'3cc'。这些文档中的每一个都有五个嵌入文档,我想通过它们的 id 更新一些嵌入文档......是否可以使用一个命令来完成,或者我必须逐个文档地完成它?

如果可能的话,我非常感谢您提供带有答案的代码示例,谢谢。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    你必须使用过滤位置更新操作$[elem],试试下面的解决方案,我已经用下面给出的一些示例文档对其进行了测试:

    解决方案:

        db.test.update({
            _id: { 
                $in: ['1aa', '1bb', '1cc'] 
            }
        }, {
            $set: {
                "embededDoc.$[elem].embededDocUpdated": true,
                "docUpdated" : "yes"
            }
        }, { arrayFilters: [{"elem._id": {$in: ['3ed',"3eg","3eb","3eh"]}}], multi: true})
    

    我已经用下面的示例文档测试了上面的查询,并且它可以正常工作:

        [{
            "_id" : "1cc",
            "player_id" : "9pp",
            "docUpdated" : false,
            "embededDoc" : [
                {
                    "_id" : "3ed",
                    "embededDocUpdated" : false,
                    "timeDocWasSaved" : "2019-04-30T08:45:50.349Z"
                },
                {
                    "_id" : "3eh",
                    "embededDocUpdated" : false,
                    "timeDocWasSaved" : "2019-04-30T08:45:50.349Z"
                }
            ]
        },
        {
            "_id" : "1bb",
            "player_id" : "9pp",
            "docUpdated" : false,
            "embededDoc" : [
                {
                    "_id" : "3ec",
                    "embededDocUpdated" : false,
                    "timeDocWasSaved" : "2019-04-30T08:45:50.349Z"
                },
                {
                    "_id" : "3eg",
                    "embededDocUpdated" : false,
                    "timeDocWasSaved" : "2019-04-30T08:45:50.349Z",
                }
            ]
        },
        {
            "_id" : "1aa",
            "player_id" : "9pp",
            "docUpdated" : false,
            "embededDoc" : [
                {
                    "_id" : "3eb",
                    "embededDocUpdated" : false,
                    "timeDocWasSaved" : "2019-04-30T08:45:50.349Z",
                },
                {
                    "_id" : "3ef",
                    "embededDocUpdated" : false,
                    "timeDocWasSaved" : "2019-04-30T08:45:50.349Z"
                }
            ]
        }]
    

    【讨论】:

    • 刚刚在 mongoDB 终端中测试了它......它就像一个魅力......非常感谢。
    • 嘿 :) 请查看this question。谢谢。
    【解决方案2】:

    试试这个

    db.collection.update(
    { "embededDoc._id": "3eb" },
    { $set: { "embededDoc.$.embededDocUpdated" :true  } }
    )
    

    【讨论】:

    • 谢谢,但这并不能回答问题。我正在尝试更新在多个文档中找到的多个嵌套文档。
    • 您能否为此提供正确的文件?您是否尝试为 where 条件下的所有文档更新 embededDocUpdated
    • 是的,我正在尝试更新 embeddedDocUpdated,但不是所有的我都在尝试通过他们的 id 更新它们......
    • 更新了答案。
    • 如果你想更新多个,你可以使用updateMany$ 是数组更新操作符https://docs.mongodb.com/manual/reference/operator/update/positional/
    猜你喜欢
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    相关资源
    最近更新 更多