繁体   English   中英

如何在pymongo中一次执行多个更新查询?

[英]How to execute multiple update queries once in pymongo?

我有超过100000条更新查询需要执行, db.collection_name.update(upsert=True)只能执行一条查询语句,如果我一一执行所有查询,那太慢了。

有什么办法可以将多个查询收集到一个列表中,然后在pymongo中执行一次?

我尝试使用bulk ,它不会节省任何时间,也不是交易操作:(

这是我的代码段:

bulk = self._db.initialize_unordered_bulk_op()
for user_id, result in results.items():
    time_stamp = time.strftime('%Y-%m-%d:%H:%M:%S')
    history = {
        'create_at': time_stamp,
        'results': result
    }
    bulk.find({'user_id': user_id}).update(
        {'$set': {'update_at': time_stamp}}
    )
    bulk.find({'user_id': user_id}).update(
        {'$addToSet': {'history': history}}
    )
bulk.execute()

它的速度几乎与以下更新语句相同:

self._db.update(
    {'user_id': user_id},
    {'$set': {'update_at':time.strftime('%Y-%m-%d:%H:%M:%S')}}, 
    upsert=True
)
self._db.update(
    {'user_id': user_id},
    {'$addToSet': {'history': history}},
    upsert=True
)

您可以引入一个计数器变量,以确保更新能够分批发送,因为写命令最多可以接受1000个操作,因此需要对操作进行分组以最多具有1000个操作,并在循环达到1000次迭代时重新初始化批量操作。 同样,DRY(不要重复自己):将更新语句$set$addToSet合并到一个更新文档中。 您的最终更新脚本应执行得更好:

bulk = self._db.initialize_unordered_bulk_op()
counter = 0;

for user_id, result in results.items():
    time_stamp = time.strftime('%Y-%m-%d:%H:%M:%S')
    history = {
        'create_at': time_stamp,
        'results': result
    }
    bulk.find({'user_id': user_id}).update({
        '$set': { 'update_at': time_stamp },
        '$addToSet': { 'history': history }
    })
    counter++

    if (counter % 1000 == 0):
        bulk.execute()
        bulk = self._db.initialize_unordered_bulk_op()

if (counter % 1000 != 0):
    bulk.execute()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM