Pymongo 不修改所有匹配的文档
Pymongo not modifying all matching documents
我正在尝试使用 pymongo 3.12 更新大约 10 万个文档。我相信我正在正确使用 pymongo api,但每次我 运行 批量写入;它只更新大约一半与之匹配的文档。
upserts = [UpdateOne({'_id': event["$set"]["metaData"]["id"]}, {'$set': event["$set"]}, upsert=True)
for event in events_update_data]
result = cursor.bulk_write(upserts, ordered=False)
print(result.bulk_api_result)
结果:
{'writeErrors': [], 'writeConcernErrors': [], 'nInserted': 0, 'nUpserted': 427, 'nMatched': 116940, 'nModified': 43303, 'nRemoved': 0, 'upserted': removed_by_me}
那么为什么它匹配了我需要的所有文档,但只修改了一半?我必须 运行 多次才能更新所有文档,并且一致性差异很大。下面是对每个文档的操作。
data = {"$set": {f'inventoryData.{self.parse_time}': event.pop("inventory"), 'metaData': event}}
我也尝试过不同的升级方式。全部重现相同的结果。
bulk_operations = cursor.initialize_unordered_bulk_op()
for event in events_update_data:
bulk_operations.find({'_id': event["$set"]["metaData"]["id"]}).upsert().update({"$set": event["$set"]})
result = bulk_operations.execute()
print(result)
和
upserts = []
for event in events_update_data:
upserts.append(UpdateOne({'_id': event["$set"]["metaData"]["id"]}, {'$set': event["$set"]}, upsert=True))
if len(upserts) == 1000:
try:
result = cursor.bulk_write(upserts, ordered=False)
upserts = []
except BulkWriteError as e:
print(e.details)
print(result.bulk_api_result)
如果您的 nMatched
高于您的 nModified
,那么您的“更新”很可能与原始记录相同,因此没有被修改。
我正在尝试使用 pymongo 3.12 更新大约 10 万个文档。我相信我正在正确使用 pymongo api,但每次我 运行 批量写入;它只更新大约一半与之匹配的文档。
upserts = [UpdateOne({'_id': event["$set"]["metaData"]["id"]}, {'$set': event["$set"]}, upsert=True)
for event in events_update_data]
result = cursor.bulk_write(upserts, ordered=False)
print(result.bulk_api_result)
结果:
{'writeErrors': [], 'writeConcernErrors': [], 'nInserted': 0, 'nUpserted': 427, 'nMatched': 116940, 'nModified': 43303, 'nRemoved': 0, 'upserted': removed_by_me}
那么为什么它匹配了我需要的所有文档,但只修改了一半?我必须 运行 多次才能更新所有文档,并且一致性差异很大。下面是对每个文档的操作。
data = {"$set": {f'inventoryData.{self.parse_time}': event.pop("inventory"), 'metaData': event}}
我也尝试过不同的升级方式。全部重现相同的结果。
bulk_operations = cursor.initialize_unordered_bulk_op()
for event in events_update_data:
bulk_operations.find({'_id': event["$set"]["metaData"]["id"]}).upsert().update({"$set": event["$set"]})
result = bulk_operations.execute()
print(result)
和
upserts = []
for event in events_update_data:
upserts.append(UpdateOne({'_id': event["$set"]["metaData"]["id"]}, {'$set': event["$set"]}, upsert=True))
if len(upserts) == 1000:
try:
result = cursor.bulk_write(upserts, ordered=False)
upserts = []
except BulkWriteError as e:
print(e.details)
print(result.bulk_api_result)
如果您的 nMatched
高于您的 nModified
,那么您的“更新”很可能与原始记录相同,因此没有被修改。