2016-08-15 3 views
0

私はノードワーカーサーバのクラスタを持っています。これはapiを起動し、データをmongo dbに挿入することを処理します。私が抱えている問題は、これらの機能の1つがすべて同じ文書の2つのコピーを頻繁に挿入するように見えるということです。文書はまだのようなクエリを使用して作成されている場合はチェックします。ノードクラスタ:一度に1つの関数のインスタンスしか実行しないようにしてください

gameDetails.findOne({ gameId: gameId }, function(err, gameCheck) { 

      if (!gameCheck) { //insert the document }; 

どのように私は、この関数は常にだけ一度に一つのインスタンスを実行していることを確認することができます。また、実際の根本的な問題を推測していない場合、このようなmongoクエリーによって、同じgameIdを含む複数の同じドキュメントが挿入されることがあります。文書は、次のようなつまり、何かが起こっているに挿入する時間があった前

答えて

0

findOneが複数回呼び出されている:

findThenInsert() findThenInsert() findThenInsert() // findOne returns null, insert called // findOne returns null, insert called // document gets inserted // findOne returns a gameCheck // document gets inserted

あなたは重複を防ぐために、一意のインデックスを使用する必要があります。そして、あなたのノードインスタンスは楽観的にインサートを即座に呼び出すことができ、遅すぎるとエラーを処理します。これは、「見つからない場合は」ロジックに似ています。また

あなたがするたびに更新されている文書を気にしないならば、あなたはアトミックであるアップサート方​​法、使用することができます。

db.collection.update(query, update, {upsert: true})

をまた

MongoDB atomic "findOrCreate": findOne, insert if nonexistent, but do not update

を見ます
関連する問題