我想更新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。
答案 0 :(得分:10)
使用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限制。 mongo shell中的 Bulk()
操作和驱动程序中的类似方法没有此限制。
答案 1 :(得分:1)
bulk = db.testdata.initialize_unordered_bulk_op()
for id in ids:
bulk.find( { '_id': id}).update({ '$set': { "isBad" : "N" }})
bulk.execute()
答案 2 :(得分:-1)
我得到了答案,可以这样做:
bulk = db.testdata.initialize_unordered_bulk_op()
for i in range (0, len(ids)):
bulk.find( { '_id': ids[i]}).update({ '$set': { "isBad" : "N" }})
print bulk.execute()