在MongoDB中的多个文档中更新多个嵌入式文档

时间:2019-04-30 11:34:54

标签: node.js mongodb mongoose

我正在尝试使用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更新一些嵌入文档...是否可以用一个命令来完成,或者我必须逐个文档地对其进行编辑?

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

2 个答案:

答案 0 :(得分:1)

尝试一下

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

答案 1 :(得分: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"
            }
        ]
    }]