代码之家  ›  专栏  ›  技术社区  ›  C8H10N4O2

通过引用相同文档中的对象更新所有对象(_M)

  •  0
  • C8H10N4O2  · 技术社区  · 4 年前

    假设我有一个像下面这样的集合。对于包含的每个文档 animals.horse ,我想设置 animals.goat 等于 动物.horse (这样马匹就不会感到孤独或寡不敌众)。

    [
      {
        "_id": 1,
        "animals": {
          "goat": 1
        }
      },
      {
        "_id": 2,
        "animals": {
          "cow": 1,
          "horse": 2,
          "goat": 1
        }
      },
      {
        "_id": 3,
        "animals": {
          "horse": 5
        }
      },
      {
        "_id": 4,
        "animals": {
          "cow": 1
        }
      }
    ]
    

    在Mongo-shell中,这可以根据需要工作:

    db.collection.update(
       {"animals.horse": { "$gt": 0 }},
       [ { "$set": { "animals.goat": "$animals.horse" } } ],
       { "multi": true }
    )
    

    这实现了期望的结果:

    [
      {
        "_id": 1,
        "animals": {
          "goat": 1
        }
      },
      {
        "_id": 2,
        "animals": {
          "cow": 1,
          "goat": 2,
          "horse": 2
        }
      },
      {
        "_id": 3,
        "animals": {
          "goat": 5,
          "horse": 5
        }
      },
      {
        "_id": 4,
        "animals": {
          "cow": 1
        }
      }
    ]
    

    然而,这在pymongo中不起作用——集合是不变的。

    db.collection.update_many( filter = {'animals.horse': {'$gt':0} },  
                               update = [ {'$set': {'animals.goat': '$animals.horse' } } ],
                               upsert = True
                            )
    

    我做错了什么?

    0 回复  |  直到 4 年前