如果嵌套字段的路径不是常量,则更新嵌套字段

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" } 
          } 
      }
  ]
)