首页 > 解决方案 > 如何在 Pymongo 中进行批量更新

问题描述

我目前有这段代码循环遍历我的 mongoDB 集合表中的每一行,并插入一行或使用新数据更新一行(取决于今天的日期和 studentID 是否存在):

for rowindex, row in InsertionData.iterrows():
    record = row.to_dict()
    record['date'] = datetime.datetime.combine(datetime.date.today(), datetime.time(0, 0))
    collection.replace_one({'student': row.get('student'), 'date': record['date']}, record, upsert=True)

但是,我想知道是否有办法进行批量 upsert?

我的想法是它将遍历所有要更新的记录,创建更新脚本并将其添加到操作数组中。然后,一旦它用完记录或达到 5000 条记录,它就会向 Mongo 运行一个 bulkWrite 函数,该函数基本上向 mongo 服务器发送一个请求,而不是 5000 个单个请求。这将使它更快,因为最大的减速是服务器之间的通信,而不是实际的更新功能本身。

有谁知道如何在 python/pymongo 中做到这一点?

标签: pymongo

解决方案


使用Bulk Write Operations.

创建一个列表并将每个更新添加为一个ReplaceOne,例如

operations = []
for rowindex, row in InsertionData.iterrows():
    record = row.to_dict()
    record['date'] = datetime.datetime.combine(datetime.date.today(), datetime.time(0, 0))
    operations.append(ReplaceOne({'student': row.get('student'), 'date': record['date']}, record, upsert=True))

collection.bulk_write(operations)

推荐阅读