mongodb - 将新项目插入到集合的所有文档到嵌套数组中
问题描述
我有一个像
"_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
}
]
我应该如何运行查询以一次在多个文档中更新它?
解决方案
您可以使用$[] 位置 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"
}
])
推荐阅读
- python - 以 subprocess.call 启动的脚本未检测到文件
- angular - 找不到打开的 Angular 网页应用程序根目录
- javascript - 为什么我的全局变量对象(window.[variable])在本地工作但不在浏览器中?
- hyperledger-fabric - 由于 tls 证书错误,Hyperledger 锚节点无法相互通信
- cmake - 如果任何线程失败,CMake 可以终止并行构建吗?
- database - 数据库可以有未命名的行吗?
- php - laravel 7:如何在原始/查询构建器中使用 if/case 语句显示数据
- python - 如何从 Entry 小部件中获取文本?
- r - 在 R 中使用 Keras 拟合模型时出现数据错误
- mingw - 为什么在msys中构建时openblas认为我正在使用Cygwin