假设我们有以下文档:
{ '_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'}}