insert_many with upsert - PyMongo



我有一些这样的数据:

data = [{'_id': 1, 'val': 5},
{'_id': 2, 'val': 1}}]

数据库中的当前数据:

>>> db.collection.find_one()
{'_id': 1, 'val': 3}

总是接收唯一的行,但不确定DB中是否已经存在这些行(例如上面的情况)。我想根据两种类型的需求对它们进行更新。

要求1

如果_id已经存在,则执行NOT更新行这在某种程度上有点容易:

from pymongo.errors import BulkWriteError
try:
db.collection.insert_many(data, unordered=False)
except BulkWriteError:
pass

执行上述操作将插入CCD_ 2行,但不会更新第一行;但它也提出了例外。

1.有没有更好的方法来执行上述操作(对于批量插入)?

要求2

这与CCD_ 3&CCD_ 4组合。因此以下数据:

data2 = [{'_id': 1, 'val': 9},
{'_id': 3, 'val': 4}}]

应该用_id=1更新该行,并在DB中插入2nd行。

问题是我一次得到数千行,不确定逐个检查和更新是否有效。

2.在MongoDB中,如果不迭代每一行,并且操作尽可能少,这一要求是否可行?

您可以生成一个更新列表,以传递给批量写入API,该API将一起发送所有操作,但它们仍将在服务器上逐个执行,但不会导致错误。

from pymongo import UpdateOne
data2 = [{'_id': 1, 'val': 9}, {'_id': 3, 'val': 4}]
upserts=[ UpdateOne({'_id':x['_id']}, {'$setOnInsert':x}, upsert=True) for x in data2]
result = db.test.bulk_write(upserts)

您可以在结果中看到,当_id被找到时,操作是no-op,但当没有找到时,它是insert。

最新更新