gpt4 book ai didi

python - 使用多个 ObjectId 在 Pymongo 中批量更新

转载 作者:IT老高 更新时间:2023-10-28 13:33:48 27 4
gpt4 key购买 nike

我想更新 mongo 集合中的数千个文档。我想使用 ObjectId 找到它们,然后无论哪个文档匹配,都应该更新。我的更新对所有文件都是一样的。我有 ObjectId 的列表。对于列表中的每个 ObjectId,mongo 应该找到匹配的文档并将该文档的“isBad”键更新为“N”

ids = [ObjectId('56ac9d3fa722f1029b75b128'), ObjectId('56ac8961a722f10249ad0ad1')]
bulk = db.testdata.initialize_unordered_bulk_op()
bulk.find( { '_id': ids} ).update( { '$set': { "isBad" : "N" } } )
print bulk.execute()

这给了我结果:

{'nModified': 0, 'nUpserted': 0, 'nMatched': 0, 'writeErrors': [], 'upserted': [], 'writeConcernErrors': [], 'nRemoved': 0, 'nInserted': 0}

这是预期的,因为它试图将“_id”与列表匹配。但我不知道如何继续。

我知道如何单独更新每个文档。我的列表大小约为 25000。我不想单独调用 25000 次电话。我收藏的文件数量要多得多。我正在使用 python2,pymongo = 3.2.1。

最佳答案

使用 for 循环遍历 id 列表并以 500 个批量发送批量更新:

bulk = db.testdata.initialize_unordered_bulk_op()
counter = 0

for id in ids:
# process in bulk
bulk.find({ '_id': id }).update({ '$set': { 'isBad': 'N' } })
counter += 1

if (counter % 500 == 0):
bulk.execute()
bulk = db.testdata.initialize_ordered_bulk_op()

if (counter % 500 != 0):
bulk.execute()

因为写入命令可以接受不超过 1000 个操作(来自 docs ),您必须将批量操作拆分为多个批处理,在这种情况下您可以选择任意批处理大小最多 1000 个。

之所以选择500,是为了保证Bulk.find()中相关文档的总和 并且更新文档小于或等于最大 BSON 文档大小,即使不保证使用默认的 1000 个操作请求将符合 16MB BSON 限制。 Bulk() mongo shell 中的操作和驱动程序中的类似方法没有此限制。

关于python - 使用多个 ObjectId 在 Pymongo 中批量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35480660/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com