Kev*_*vad 6 mongodb pymongo pymongo-3.x
我有一些这样的数据:
data = [{'_id': 1, 'val': 5},
{'_id': 2, 'val': 1}}]
Run Code Online (Sandbox Code Playgroud)
db中的当前数据:
>>> db.collection.find_one()
{'_id': 1, 'val': 3}
Run Code Online (Sandbox Code Playgroud)
我总是收到唯一的行但不确定它们中是否存在任何行(例如上面的情况).我想根据两种类型的要求更新它们.
要求1:
千万不要,如果更新的行_id已经存在.这在某种程度上很容易:
from pymongo.errors import BulkWriteError
try:
db.collection.insert_many(data, unordered=False)
except BulkWriteError:
pass
Run Code Online (Sandbox Code Playgroud)
执行上面的操作会插入2nd行,但不会更新第一行; 但它也提出了例外.
1.有没有更好的方法进行上述操作(批量插入)?
要求2
这类似于update_if_exists和insert if not exists组合.所以以下数据:
data2 = [{'_id': 1, 'val': 9},
{'_id': 3, 'val': 4}}]
Run Code Online (Sandbox Code Playgroud)
应该用行更新行_id=1并2nd在DB中插入行.
问题是我一次得到数千行,并且不确定逐个检查和更新是否有效.
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)
Run Code Online (Sandbox Code Playgroud)
在结果中可以看到,当找到_id 时,该操作是一个空操作,但当它没有找到时,它就是一个插入。
| 归档时间: |
|
| 查看次数: |
1308 次 |
| 最近记录: |