2015-09-28 33 views
6

バルク挿入を実行して重複キーエラーが発生した場合はどうすればよいですか?mongodbバルク挿入重複キーエラーを避ける

idフィールド(ではなく、_id)に一意のインデックスを持つコレクションがあり、その中にいくつかのデータがあります。それから私はより多くのデータを取得し、コレクションに存在しないドキュメントだけを追加したい。

私は次のコードを持っている:

let opts = { 
    continueOnError: true, // Neither 
    ContinueOnError: true, // of 
    keepGoing: true,  // this 
    KeepGoing: true,  // works 
}; 
let bulk = collection.initializeUnorderedBulkOp(opts); 
bulk.insert(d1); 
bulk.insert(d2); 
bulk.insert(d3); 
... 
bulk.insert(dN); 
let result = yield bulk.execute(opts); // this keep throwing duplicate key error 

を、私はちょうどエラーを無視し、すべてのキューに入れられた操作で一括仕上げをさせたい

私は、Bulkためnpm module apiにし、MongoDBのAPIの検索initializeUnorderedBulkOpと運とBulk writeためのドキュメント。エラーが書き込み操作の一つの処理中に発生した場合

エラー処理、MongoDBのプロセスに

続ける:順序なしの操作のためのドキュメント彼らsayでも


残りの書き込み操作はリストに残ります。

WICHが(少なくとも私の場合には)真実ではありません:(

すべてのアイデアは大歓迎です!

+0

:ここ

は、ドキュメントへのリンクです応答の「エラーのリスト」。これについて最初に不平を言う人ではありません。一般的なアドバイスでは、エラーを「無視」し、結果オブジェクトを自分で検査します。結果は**常に**バッチの最後までとにかく続きます。だからあなたは実際には**実際には**すべての操作をリストに書いていたのですが、エラーが発生しました。 –

+0

明示していただきありがとうございますが、私の問題は約束を使って 'execute'メソッドが例外を発生させ、約束がエラーだけで拒否されるということです。 'BulkWriteResult'オブジェクトを失います。 – Volox

+0

はい。これはまさに私の反応です。以前のドライバーはこの場合例外を発生させませんでした。しかし、これは "UnOrdered"オペレーションがどのように処理されるかに影響しません。バッチは全体として "まだ"実行されていますが、レスポンスオブジェクトに "エラー"を返すのではなく、実行時に少なくとも1つのエラーが発生したときに結果がスローされ、エラーになります。今理解していますか? –

答えて

2

あなたは(バージョン3.2で新しい。)db.collection.insertManyを()、使用することができます:

は命じ:偽falseに注文して

、重複キーエラーの場合は、挿入残りの文書があれば操作は続行されます。それは誤解を招くおそれがあり、以前 `UnOrderdedBukOp`構築物は唯一の「thows」、しかしが生成するエラーが発生したことがないだろうとして、エラーの場合は、実際に、最近のリリースでは変更されてい https://docs.mongodb.com/v3.2/reference/method/db.collection.insertMany/

関連する問題