更新嵌套的 MongoDB 集合 (Pymongo)

Posted

技术标签:

【中文标题】更新嵌套的 MongoDB 集合 (Pymongo)【英文标题】:Updating nested MongoDB collection (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

感谢您的帮助。

【问题讨论】:

【参考方案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,答案真的很有帮助。它工作得很好。

以上是关于更新嵌套的 MongoDB 集合 (Pymongo)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python mongodb 客户端库(pymongo)更新 mongodb 集合中所有文档的字段“类型”

使用 pymongo 运行多个更新语句时,有时 MongoDB 不会更新

使用 python 和 pymongo 的 MongoDB 位置运算符索引问题

将 Null 项插入集合 Mongodb (Pymongo)

如何使用 pymongo 在 mongodb 中重命名父字段名称和嵌套字段值?

如何使用 pymongo 更新值?