PyMongo:如何在不使用更新运算符的情况下update_many?

时间:2017-08-02 21:57:11

标签: python mongodb pymongo

如果无法使用更新运算符直接表示修改,更新多个文档的最佳方法是什么?

这是我到目前为止所做的:

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)

有更好的方法吗?

1 个答案:

答案 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