如何使用Pymongo更新文档中的某些字段



假设我们有以下文档:

{ '_id': 1, 'Name': 'Document1', 'Data': { 'Color': 'Green', 'Size': 5 } }

并且我们想使用Pymongo使用字典作为源来更新文档。例如,假设这是我们想要用来更新文档的字典:

dict1 = { 'Name': 'Document1', 'Data': { 'Size': 5 } }

如果我们确定dict1中包含哪些字段,我们可以使用:

collection.update_one( { 'Name': dict1['Name'] }, { '$set': { 'Data.Size': dict1['Data']['Size'] } })

在一般情况下,我们不知道dict1['Data']域内是什么,下面的方法:

collection.update_one( { 'Name': dict1['Name'] }, { '$set': { 'Data': dict1['Data'] } })

将潜在地删除文档中存在但不在dict1中的任何字段(在我们的示例中,'Color')。

是否有可能告诉Pymongo我们想要更新一个字段(包含许多字段),但只在源字典中插入/更新字段?

你必须使用$set(又名$addFields)的聚合风格来实现这一点:

from pymongo import MongoClient
db = MongoClient()['mydatabase']
collection = db.mycollection
collection.insert_one({'_id': 1, 'Name': 'Document1', 'Data': {'Color': 'Green', 'Size': 5}})
dict1 = {'Name': 'Document1', 'Data': {'Size': 6, 'Fitting': 'Wide'}}
collection.update_many({'Name': dict1.get('Name')}, [{'$addFields': {'Data': dict1.get('Data')}}])
print(collection.find_one())

打印:

{'_id': 1, 'Name': 'Document1', 'Data': {'Color': 'Green', 'Size': 6, 'Fitting': 'Wide'}}

最新更新