[英]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.