2011-08-14 9 views
0

私は、ノード-mongodb-driverをnodeJSに直接使用してコードを書いています。自分の_idスペースを使用するコレクションを私のデータベースに設定しました。そこには、ユニークなドキュメントごとにユニークな_idがあることが保証されています。つまり、アイテムがデータベースに追加される方法は、同じアイテムが複数回コレクションに挿入される可能性が高いということです。つまり、同じアイテムを複数回使用することを意味します。node-mongodb-nativeでは、重複した_idを持つ文書を挿入する可能性がある場合、チェックする必要はありますか?

私が今問題を避けるためにやっていることは、挿入前にcollection.findOne(_id:ID)と呼んで、すでにコレクションに入っているドキュメントを挿入しようとしていないことを確認することです。しかし、私は一度にたくさんのドキュメントを追加しているので、非同期である必要があります。findOne()のコールバックが呼び出されたときに、適切な変数(該当する場合)を挿入できるように、多数の変数を保存しています。

しかし、文書がすでに存在するかどうかを確認するのをやらなくても、変数を保存することはできません。同じ_idのコレクションにすでにドキュメントがある場合、私はちょうど、_idが既に存在し、コードが実行され続けると言うエラーを得ることになります。これをコーディングすると、私のソフトウェアの実行時間(関数が呼び出されない)とそれが占めるRAM内のスペース(多くの変数の保存が少なくなります)が減少します。

しかし、誰かがこれをしない理由があると思っていたかどうかを見たいと思っていました。 のような関数がエラーを返すと、何が起こっているのか、起きている可能性がありますか?

ベスト、と感謝は、
サミ

答えて

1

は、だからあなたの基本的な考え方は、あなたがfindOne()は、同時実行の問題を解決しないことを正しい、正しいです。しかし、いくつかのしわがあります。

何か悪いことが起こっているか、私が気づいていない可能性がありますか?

最初の問題は、重複エラーのためにエラーが発生していない可能性があります。insertおそらく、DBがダウンしているか、何か他のものが原因で失敗しているかもしれません。エラーの理由と適切な処理を確認してください。

通常、高価な傾向があるため、多くの例外をスローしたくありません。それで、この複製インサートをあまり頻繁にやっていないことに気をつけてください。

2番目の問題は、挿入データに関連しています。

サーバ1はinsertを生成し、サーバ2は、同じ文書のinsertを生成する場合、それらは同じinsert文を生成するのですか?

  • 答えがの場合はの場合は、おそらく正しいことです。
  • 答えがでない場合、の場合は、upsertコマンドを参照してください。これはすべてのケースでうまくいくわけではありませんが、あなたにとってはうまくいくかもしれません。
  • さらに、findAndModify commandもあります。例外をスローする代わりに、変更したオブジェクトを返すことができます。これは学習曲線が大きくなりますが、が最適なオプションです。
+0

私の状況では、1台のサーバーしか使用していません。唯一可能な挿入エラーは重複IDエラーであると仮定しましょう。 'findOne()'を使用して何かが先に存在するかどうかを確認するよりも、この重複エラーを受け取る方がコストがかかりますか?私はそれが事実ではないように感じるが、私は確かに分からないので、私はここで尋ねる... – thisissami

関連する問題