MongoEngine批量更新报错:TypeError参数重复传递问题求助
解决MongoEngine批量更新时的TypeError参数错误问题
这个错误很典型,是因为你搞混了MongoEngine中两种批量更新方法的用法!
错误原因分析
你遇到的 TypeError: update() got multiple values for argument 'upsert',核心问题是**objects.update() 方法的参数用法完全错了**:
update()是用来针对查询集做统一更新的(比如把所有符合uid__type="binData"的文档某个字段改成同一个值),它的第一个位置参数是查询筛选条件,后面跟要更新的键值对,upsert是关键字参数。- 你直接把
analytics文档对象列表作为第一个参数传进去,导致方法把这个列表当成了查询条件,同时又传了upsert=False,就出现了参数冲突的报错。
正确的批量更新方法
MongoEngine中要批量更新多个不同的文档实例,应该用 bulk_update() 方法,而不是update()。下面是修正后的完整代码:
query = Analytic.objects(uid__type="binData") analytics = [] for analytic in query: analytic.sessionId = str(analytic.sessionId) analytic.uid = str(analytic.uid) analytics.append(analytic) if len(analytics) % 10000 == 0: print(".") if len(analytics) == 100000: # 使用bulk_update批量更新指定字段 Analytic.objects.bulk_update(analytics, fields=['sessionId', 'uid']) analytics = [] # 别忘了处理最后一批不足100000的文档 if analytics: Analytic.objects.bulk_update(analytics, fields=['sessionId', 'uid'])
关键说明
bulk_update()的参数要求:- 第一个参数是要更新的文档对象列表;
fields参数必须明确指定要更新的字段(比如这里的sessionId和uid),这样MongoEngine只会更新你修改过的字段,避免不必要的性能开销。
- 额外优化建议:
- 10万条一批的更新量可能对数据库压力较大,建议根据你的MongoDB性能调整批次大小(比如改成1万一批);
- 如果你的MongoEngine版本较旧,
bulk_update可能存在一些限制(比如不支持更新带默认值的字段),可以考虑升级到最新稳定版本。
内容的提问来源于stack exchange,提问作者Badjano
相关产品推荐
相关产品推荐

