pymongo批量操作相关:如何获取插入数、忽略重复数及MongoDB更新行数
pymongo批量插入统计及更新行数获取方法
insert_many操作的统计
首先明确:insert_many执行完成后返回的不是游标对象,是InsertManyResult类型的结果实例,不需要从游标获取属性,直接通过该结果实例的相关参数即可统计数据:
- 如果你需要插入时自动忽略重复数据,需要先给对应字段创建唯一索引,同时调用
insert_many时指定ordered=False参数,否则遇到重复唯一键的文档会直接抛出异常终止操作,无法继续插入剩余文档。 - 成功插入的文档数量:直接读取
len(result.inserted_ids)即可,inserted_ids列表存储了所有成功插入文档的_id值。 - 被忽略的重复数据数量:常规场景下直接用待插入的总数据量减去成功插入的数量即可得到。如果需要更精准的统计(排除其他插入错误的干扰),可以捕获
BulkWriteError异常,从异常详情中统计错误码为11000(重复键错误)的条目数量,就是准确的重复忽略数。
参考代码示例:
from pymongo.errors import BulkWriteError data = [{"id": 1, "name": "a"}, {"id": 2, "name": "b"}, {"id": 1, "name": "a"}] try: insert_result = db_connection.collection.insert_many(data, ordered=False) success_count = len(insert_result.inserted_ids) duplicate_count = len(data) - success_count except BulkWriteError as e: # 精准统计重复错误的数量 duplicate_count = sum(1 for err in e.details["writeErrors"] if err["code"] == 11000) success_count = e.details["nInserted"] print(f"成功插入数量:{success_count}") print(f"被忽略的重复数量:{duplicate_count}")
更新操作的行数获取
pymongo的更新类操作(update_one、update_many、replace_one)执行后返回的是UpdateResult类型的实例,直接读取对应属性即可得到行数:
matched_count:匹配到查询条件的文档总数量,不管文档内容是否实际发生了修改。modified_count:本次操作实际修改的文档数量,如果更新的内容和文档原有内容完全一致,该值为0。
参考代码示例:
# 多条更新示例 update_result = db_connection.collection.update_many( {"age": {"$lt": 18}}, {"$set": {"tag": "未成年"}} ) print(f"匹配到的文档数:{update_result.matched_count}") print(f"实际修改的文档数:{update_result.modified_count}")
内容的提问来源于stack exchange,提问作者TomCat
相关产品推荐
相关产品推荐

