首页 > 解决方案 > 将新项目插入到集合的所有文档到嵌套数组中

问题描述

我有一个像

"_id" : ObjectId("5b0cf3b77f8b9a0a1330f26s"),
"group" : ObjectId("5b0cf3b77f8b9a0a1330f27f"),
"referrers" : [
    {
        "referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20c")
    },
    {
        "referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20d")
    },
    {
        "referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20e")
    }
]

现在我需要将一个新项目 { "canAddUse" : true} 更新为所有文档中的引用者嵌套数组。输出应该是这样的:

"_id" : ObjectId("5b0cf3b77f8b9a0a1330f26s"),
"group" : ObjectId("5b0cf3b77f8b9a0a1330f27f"),
"referrers" : [
    {
        "referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20c"),
        "canAddUser" : true
    },
    {
        "referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20d"),
        "canAddUser" : true
    },
    {
        "referrer_id" : ObjectId("5b0cf3b77f8b9a0a1330f20e"),
        "canAddUser" : true
    }
]

我应该如何运行查询以一次在多个文档中更新它?

标签: mongodbmongodb-query

解决方案


您可以使用$[] 位置 all运算符(MongoDB 3.6+)来更新数组中的所有元素并multi: true更新所有文档。

db.col.update({}, { $set: { "referrers.$[].canAddUser": true } }, { multi: true })

对于较低的 MongoDB 版本,您可以使用$addFields覆盖现有字段并使用$out覆盖现有集合:

db.colname.aggregate([
    {
        $addFields: {
            referrers: {
                $map: {
                    input: "$referrers",
                    as: "r",
                    in: { referrer_id: "$$r.referrer_id", canAddUser: true }
                }
            }
        }
    },
    {
        $out: "colname"
    }
])

推荐阅读