mongodb - 如果指向它的路径不是恒定的,则更新嵌套字段
问题描述
我正在研究使用 MongoDB 的 Django。其中一个集合具有以下结构:
{
"inspectionType" : {
"id" : "59a79e44d12b52042104c1e8",
"name" : "Example Name",
"inspMngrsRole" : [
{
"id" : "55937af6f3de6c004bc42862",
"type" : "inspectorManager",
"is_secret_shoper" : false
}
],
"scopes" : {
"56fcf6736389b9007a114b10" : {
"_cls" : "SomeClass",
"id" : "56fcf6736389b9007a114b10",
"name" : "Example Name",
"category" : "Example Category"
},
}
}
}
我需要为集合中的所有文档更新字段“_cls”(“inspectionType.scopes.._cls”)。问题是 scope_id 对于每个范围都是动态且唯一的。是否可以为此使用 db.collection.update ?通往该领域的路径应该如何?
更新: MongoDB 版本:3.6.7
解决方案
您可以使用聚合(如果您使用低于 4.2 的 MongoDB 版本)加上更新操作或方法(如果使用 4.2 或更高版本)进行更新,updateMany
如下所示:
# 1
var NEW_VALUE = "some new value" // the value to be updated
db.collection.aggregate( [
{
$addFields: {
"inspectionType.scopes": { $objectToArray: "$inspectionType.scopes" }
}
},
{
$addFields: {
"inspectionType.scopes.v._cls": NEW_VALUE
}
},
{
$addFields: {
"inspectionType.scopes": { $arrayToObject: "$inspectionType.scopes" }
}
}
] ).forEach( doc => db.scopes.updateOne( { _id: doc._id }, { $set: { "inspectionType.scopes": doc.inspectionType.scopes } } ) )
从 MongoDB 4.2 版开始,updateMany
可以使用聚合管道进行更新操作;请参阅使用聚合管道更新。
# 2
db.collection.updateMany(
{ },
[
{
$set: {
"inspectionType.scopes": { $objectToArray: "$inspectionType.scopes" }
}
},
{
$set: {
"inspectionType.scopes.v._cls": NEW_VALUE
}
},
{
$set: {
"inspectionType.scopes": { $arrayToObject: "$inspectionType.scopes" }
}
}
]
)
推荐阅读
- javascript - TypeScript:具有已知键的对象上的 Object.keys() 类型过于通用
- reactjs - 将变量连接到数组映射方法
- java - Android 中对 Vulkan 的 Java SDK 支持
- javascript - 对象内的 Json 对象:这是正确的格式吗
- php - 在 laravel 中动态设置菜单项的活动类
- angular - 为什么 PrimeNg pSortableColumn 没有容器项目的点击事件?
- arrays - 在 Google 表格中使用数组公式滚动总和
- regex - 将所有特殊字符和单词分隔到字符串列表中的项目中 - 正则表达式
- html - CSS中的不透明度不影响div
- c++ - 反转一个数字并从头开始删除零