更新嵌套的 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)