1. ホーム
  2. python

[解決済み] mongodb: 存在しない場合は挿入する

2022-02-17 18:37:36

質問

毎日、文書のストック(更新)が届きます。まだ存在しない項目を挿入したいのです。

  • また、最初に挿入したときと、最後に更新で見たときを記録しておきたいと思います。
  • ドキュメントが重複しないようにしたい。
  • 以前保存した文書で、自分の更新にないものを削除したくないのですが。
  • 95%(推定)のレコードが日々変更されない。

Pythonドライバ(pymongo)を使用しています。

現在私が行っていることは(擬似コード)です。

for each document in update:
      existing_document = collection.find_one(document)
      if not existing_document:
           document['insertion_date'] = now
      else:
           document = existing_document
      document['last_update_date'] = now
      my_collection.save(document)

私の問題は、非常に遅いことです(10万件未満のレコードで40分、更新には数百万件のレコードがあります)。 私はこれを行うための組み込みの何かがあることを確信していますが、update()のためのドキュメントは、うーん......少し渋いです......。( http://www.mongodb.org/display/DOCS/Updating )

どうすれば早くできるのか、誰かアドバイスしてください。

解決方法は?

あなたはquot;upsert;をしたいようですね。 MongoDB にはこのためのサポートが組み込まれています。 update() の呼び出しに追加のパラメータを渡します。 {upsert:true} とします。 たとえば、以下のようになります。

key = {'key':'value'}
data = {'key2':'value2', 'key3':'value3'};
coll.update(key, data, upsert=True); #In python upsert must be passed as a keyword argument

これは、if-find-else-updateブロックを完全に置き換えます。 キーが存在しない場合は挿入し、存在する場合は更新します。

以前は

{"key":"value", "key2":"Ohai."}

後です。

{"key":"value", "key2":"value2", "key3":"value3"}

また、どのようなデータを書き込むかを指定することもできます。

data = {"$set":{"key2":"value2"}}

これで、選択した文書は "key2" の値のみを更新し、他のすべてをそのままにします。