10

次のようなデータがあります。

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

データベースの現在のデータ:

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

私は常に一意の行を受け取りますが、それらのいずれかが DB に既に存在するかどうかはわかりません (上記の場合など)。そして、2 種類の要件に基づいてそれらを更新したいと考えています。

要件 1 :

行が既に存在する場合は更新しないでください。_idこれはある意味で簡単です:

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

上記を実行すると行が挿入2ndされますが、最初の行は更新されません。ただし、例外も発生します。

1.上記の操作を行うより良い方法はありますか(一括挿入の場合)?

要件 2

update_if_existsこれは&insert if not exists結合に似ています。したがって、次のデータ:

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

行を更新してDBに_id=1挿入する必要があります。2nd

問題は、一度に何千もの行を取得し、1 つずつチェックして更新することが効率的かどうかわからないことです。

2.この要件は、MongoDB で各行を反復せずに、できるだけ少ない操作で実現できますか?

4

1 に答える 1