pymongo - 如何在 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 中做到这一点?
解决方案
创建一个列表并将每个更新添加为一个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)
推荐阅读
- reporting-services - 带有渐进式搜索的 SSRS 下拉菜单
- c - 将局部变量设置为全局,以便主函数可以在 C 中访问它
- python - 如何在 python 中实际使用 NotImplementedError?
- c++ - 使用强类型定义 CPP 定义枚举
- mysql - 如何从查询mysql中的选定列中选择记录
- php - 如何在单个屏幕中按类别和子类别显示所有产品?
- java - spring LDAP 不会抛出特定的错误代码
- javascript - 使用国家代码 +39 06 时 google-libphonenumber 的问题
- python - 我正在尝试在 Python 中使用 Matplotlib 执行代码,并在将 fill_between() 用于 matplotlib 3.3.0 时遇到以下问题
- java - 如何将 Build>Project 绑定到 Javatar(Sublime Text 3)中的键?