如果无法使用更新运算符直接表示修改,更新多个文档的最佳方法是什么?
这是我到目前为止所做的:
def modify_doc(doc):
// modify doc in place
return modified_doc
for doc in db.collection.find({}):
mod_doc = modify_doc(doc)
collection.replace_one({'_id': mod_doc._id}, new_doc)
我也在考虑:
def get_update_instructions(doc):
mod_doc = modify_doc(doc)
// take diff between doc and mod_doc and create update_instructions
return update_instructions
for doc in db.collection.find({}):
update_instructions = get_update_instructions(doc)
collection.update_one({'_id': mod_doc._id}, update_instructions)
有更好的方法吗?
答案 0 :(得分:3)
您仍然可以应用批量更新,这类似于在SQL数据库中执行批处理事务(但没有回滚,所以要小心)。这是巧妙记录的,但它是通过bulk_write
对象上的pymongo.Collection
方法。基本方法是通过创建UpdateOne实例并将它们放入列表来手动聚合更新操作。然后,当您准备写入数据库时,请调用bulk_write
作为基于您当前代码的基本示例:
from pymongo import UpdateOne
def modify_doc(doc):
// modify doc in place
return modified_doc
bulk_updates = []
for doc in db.collection.find({}):
mod_doc = modify_doc(doc)
bulk_updates.append(UpdateOne({'_id': mod_doc._id}, mod_doc))
db.collection.bulk_write(bulk_updates)
有关可以与bulk_write方法一起使用的更多操作,请参阅文档链接:http://api.mongodb.com/python/current/api/pymongo/operations.html