使用 python 函数更新 mongodb 中所有文档的智能方法
Smart way to update all documents in mongodb using python function
我对集合的所有元素执行 some_python_function
。
此函数 returns 每个文档的不同值。
我开发了下面的功能,但是速度很慢
for doc in db.collection.find(query, projection):
result = db.collection.update_one(
{"_id": doc["_id"]},
{"$set": {"field": some_python_function(doc["field"])}}
)
我正在寻找更聪明的方法来做到这一点,而不是一个接一个地更新文档。
你会推荐什么?
编辑:
我刚刚在 API 中发现批量操作:
https://pymongo.readthedocs.io/en/stable/examples/bulk.html
from pymongo import UpdateOne
updates = []
for doc in db.collection.find(filter, projection):
if doc.get("titles"):
updated_field = some_python_function(doc["field"])
if doc["field"] != updated_field:
updates.append(
UpdateOne(
{"_id": doc["_id"]},
{"$set": {"field": updated_field)}}
)
)
if updates:
result = collection.bulk_write(updates)
使用bulkWrite一次写入多个文档。
Here is an answer 类似问题。
我对集合的所有元素执行 some_python_function
。
此函数 returns 每个文档的不同值。
我开发了下面的功能,但是速度很慢
for doc in db.collection.find(query, projection):
result = db.collection.update_one(
{"_id": doc["_id"]},
{"$set": {"field": some_python_function(doc["field"])}}
)
我正在寻找更聪明的方法来做到这一点,而不是一个接一个地更新文档。
你会推荐什么?
编辑: 我刚刚在 API 中发现批量操作: https://pymongo.readthedocs.io/en/stable/examples/bulk.html
from pymongo import UpdateOne
updates = []
for doc in db.collection.find(filter, projection):
if doc.get("titles"):
updated_field = some_python_function(doc["field"])
if doc["field"] != updated_field:
updates.append(
UpdateOne(
{"_id": doc["_id"]},
{"$set": {"field": updated_field)}}
)
)
if updates:
result = collection.bulk_write(updates)
使用bulkWrite一次写入多个文档。
Here is an answer 类似问题。