繁体   English   中英

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}}

我也尝试过不同的 upserting 变体。 都重现了相同的结果。

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 ,那么您的“更新”很可能与原始记录相同,因此不会被修改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM