首页 > 解决方案 > 如果指向它的路径不是恒定的,则更新嵌套字段

问题描述

我正在研究使用 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

标签: mongodbmongoengine

解决方案


您可以使用聚合(如果您使用低于 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" } 
          } 
      }
  ]
)

推荐阅读