我需要在远程MongoDB实例中插入一组文档,其中一些文档可能已经驻留在实例中,即具有_id参数。我希望MongoDB忽略这些文件并提交其余文件。
目前PyMongo的insert方法的默认行为是,它为远程服务器上遇到的每个重复文档返回一个DuplicateError Exception。我想将这种行为压制成更多的火,忘记一种功能。
如果有人知道该怎么做。这会很明显。
答案 0 :(得分:1)
对于可能存在重复键错误的批量插入,您需要设置continue_on_error
flag。
使用此标志即使发生错误,插入也将继续。最后一个错误将由getLastError
报告 - 您可以捕获,或者如果您想要火,请忘记将write concern设置为0。
from pymongo import *
client = MongoClient()
coll = client.test.test
coll.drop()
# Add a test document
coll.save({'_id': 1, 'hello': 'world'})
print(coll.count())
# Without the flag - Boom
coll.insert([{"_id": 1, "hello": "world"},
{"_id": 2, "Howdy": "Worldy"}])
print(coll.count())
# With a write concern of 0 - no error but not saved.
coll.insert([{"_id": 1, "hello": "world"},
{"_id": 2, "Howdy": "Worldy"}], w=0)
print(coll.count())
# Will error but will insert as well
coll.insert([{"_id": 1, "hello": "world"},
{"_id": 2, "Howdy": "Worldy"}], continue_on_error=True)
print(coll.count())
# With a continue_on_error and write concern of 0 - will only error if theres
# some socket or network error
coll.insert([{"_id": 1, "hello": "world"},
{"_id": 2, "Howdy": "Worldy"},
{"_id": 3, "Hi": "World"}], w=0, continue_on_error=True)
print(coll.count())