【问题标题】:Updating nested MongoDB collection (Pymongo)更新嵌套的 MongoDB 集合 (Pymongo)
【发布时间】:2021-12-05 04:05:21
【问题描述】:

-编辑-

如何根据多个条件使用 Pymongo 更新嵌套集合?

我的文档如下所示:

[{'_id': ObjectId('613eb154aee899694f934259'),
  'company': 
      [{'name': 'Flower shop', 
        'persons': 
            [{'personId': '1000',
              'personIdType': 'Passport/Others'},
             {'personId': '3000',
              'personIdType': 'Passport/Others'}
            ]}
      ]}
]

我想将 personId 1000 更新为 2000。因此这两个条件是:objectId = '613eb154aee899694f934259' AND the personId = 1000

感谢您的帮助。

【问题讨论】:

    标签: python database mongodb mongodb-query pymongo


    【解决方案1】:

    尝试使用$set 设置personId 字段。您需要arrayFilter 来指定数组的过滤条件。

    db.collection.update({
      _id: ObjectId("613eb154aee899694f934259")
    },
    {
      $set: {
        "company.$[].persons.$[p].personId": 2000
      }
    },
    {
      arrayFilters: [
        {
          "p.personId": "1000"
        }
      ]
    })
    

    这是Mongo playground 供您参考。

    【讨论】:

    • 嗨,雷,非常感谢。它在有 1 条记录或 personId 时有效。但是,当我有多个条件要测试时,我该怎么做呢?我已经编辑了这个问题。再次感谢您。
    • @Ry123 将解决方案更新为使用arrayFilter。当您必须大量使用数组时,您会发现这非常有用。
    • 我尝试了该方法,但它显示错误:` TypeError: upsert must be True or False.我添加了upsert = True 作为update 函数的最后一个参数,我得到了TypeError: update() got multiple values for argument 'upsert'。有没有其他方法可以做到这一点?
    • @Ry123 this 可能就是你要找的东西
    • @ray,你的答案是正确的,只是你必须将代码转换为 python,因为arrayFilters 在 python 中以不同的方式工作。赞成你的答案
    【解决方案2】:

    @ray's 答案是正确的。但是你必须将他的解决方案转换为python。

    下面的答案是在 python 中转换的@ray 答案的精确复制。

    from pymongo import MongoClient
    from bson.objectid import ObjectId
    
    
    col = MongoClient()["temp"]["tmp9"]
    
    col.update_many({
      "_id": ObjectId("613eb154aee899694f934259"),
    }, {
      "$set": {
        "company.$[].persons.$[p].personId": "2000",
      }
    },
      array_filters=[{"p.personId": "1000"}]
    )
    

    【讨论】:

    • 很抱歉,我仍在从我熟悉的本机查询中调整 pymongo 语法。非常感谢@hhharsha35 的简短、简洁和高质量的回答:)
    • 谢谢@ray 和hhharsha36,答案真的很有帮助。它工作得很好。
    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2023-04-03
    • 2021-11-30
    • 2015-08-27
    • 1970-01-01
    • 2020-12-24
    • 2020-07-04
    相关资源
    最近更新 更多