11

私のすべてのドキュメントに少なくともこれらの2つのフィールドが含まれているコレクションがあります。たとえばname、and urlurl一意であるため、一意のインデックスを設定します)。これで、重複したドキュメントを挿入しようとするとurl、エラーが発生し、プログラムが停止します。この動作は望ましくありませんが、mongoDBが重複してドキュメントを挿入して次のドキュメントに進むことがないように、mysqlのようなものが必要です。 insert or ignoreurl

insertこの動作を実現するためにコマンドに渡すことができるパラメーターはありますか?私は通常、次のように使用して挿入のバッチを実行しますpymongo

collection.insert(document_array)

これcollectionがコレクションでありdocument_array、ドキュメントの配列です。

insert or ignoreでは、複数のドキュメントを挿入するための機能を実装する方法はありますか?

4

7 に答える 7

13

insert()continue_on_errorを呼び出すときにフラグを設定します。注: PyMongo ドライバー 2.1 とサーバー バージョン 1.9.1 が必要です。

continue_on_error (オプション): True の場合、データベースは一括挿入が失敗しても処理を停止しません (重複 ID など)。これにより、一括挿入は一連の単一挿入と同様に動作しますが、最後の挿入だけでなく、いずれかの挿入が失敗した場合に lastError が設定される点が異なります。複数のエラーが発生した場合、最新のエラーのみが error() によって報告されます。

于 2012-09-04T17:07:52.523 に答える
11

これを試して:

try:
    coll.insert(
        doc_or_docs=doc_array,
        continue_on_error=True)
except pymongo.errors.DuplicateKeyError:
    pass

挿入操作でエラーが発生した場合 (一意のインデックスに重複する値を挿入しようとした場合など) は、引き続き例外がスローされますが、配列内の他の項目には影響しません。その後、上記のようにエラーを飲み込むことができます。

于 2012-09-04T16:18:13.677 に答える
0

ブロック.insert()内に呼び出しを入れて、挿入が失敗した場合に続行してみませんか?try: ... except:

さらに、フラグを使用して通常update()の呼び出しを使用することもできます。upsert詳細はこちら:http ://www.mongodb.org/display/DOCS/Updating#Updating-update%28%29

于 2012-04-30T18:58:38.443 に答える
0

Python スクリプトのメモリ内にドキュメントの配列が既にある場合は、それらを反復して挿入し、一意のインデックスが原因で挿入に失敗したものを単純にキャッチしてみませんか?

for doc in docs:
  try:
    collection.insert(doc)
  except pymongo.errors.DuplicateKeyError:
    print 'Duplicate url %s' % doc

ここで、collection は接続/データベース インスタンスから作成されたコレクションのインスタンスであり、docs は現在挿入するために渡す辞書 (ドキュメント) の配列です。

exceptブロック内の一意のインデックスに違反する重複キーをどうするかを決定することもできます。

于 2012-04-30T19:00:22.743 に答える
-2

私がしていること:

  1. 挿入したいMongoDBIDの配列を生成します(私の場合はいくつかの値のハッシュ)
  2. 既存のIDを削除します(Redisキューのbcozパフォーマンスを使用していますが、mongoにクエリを実行できます)
  3. クリーンアップしたデータを挿入してください!

Redisはそのために最適です。必要に応じて、MemcachedまたはMysqlメモリを使用できます。

于 2012-08-29T14:47:34.327 に答える
-2

使用することを強くお勧めしますupsert

  stat.update({'location': d['user']['location']}, \
       {'$inc': {'count': 1}},upsert = True, safe = True)

statビジターの場所が既にコレクションに存在する場合は、コレクションがcount1 つ増えます。それ以外の場合countは に設定され1ます。

ドキュメントへのリンクは次のとおりですhttp://www.mongodb.org/display/DOCS/Updating#Updating-UpsertswithModifiers

于 2012-04-30T19:10:32.987 に答える