如果嵌套字段的路径不是常量,则更新嵌套字段
Update nested field if a path to it isn't constant
我正在开发使用 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
您可以使用聚合更新(如果您使用的 MongoDB 版本低于 4.2)加上更新操作 或 updateMany
方法(如果使用4.2或更高版本)如下:
# 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
可以使用聚合管道进行更新操作;参见 Update with Aggregation Pipeline。
# 2
db.collection.updateMany(
{ },
[
{
$set: {
"inspectionType.scopes": { $objectToArray: "$inspectionType.scopes" }
}
},
{
$set: {
"inspectionType.scopes.v._cls": NEW_VALUE
}
},
{
$set: {
"inspectionType.scopes": { $arrayToObject: "$inspectionType.scopes" }
}
}
]
)
我正在开发使用 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
您可以使用聚合更新(如果您使用的 MongoDB 版本低于 4.2)加上更新操作 或 updateMany
方法(如果使用4.2或更高版本)如下:
# 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
可以使用聚合管道进行更新操作;参见 Update with Aggregation Pipeline。
# 2
db.collection.updateMany(
{ },
[
{
$set: {
"inspectionType.scopes": { $objectToArray: "$inspectionType.scopes" }
}
},
{
$set: {
"inspectionType.scopes.v._cls": NEW_VALUE
}
},
{
$set: {
"inspectionType.scopes": { $arrayToObject: "$inspectionType.scopes" }
}
}
]
)