2016-06-28 4 views
0

で同期(重複しない)情報を保存し、私は同じコレクションのドキュメントに保存したい:このMEANスタックプロジェクトのために非同期プロセス

  • 異なる種類のタイプごとに
  • ユニーク年代番号。

例:

{ID:1、タイプ: 'A'、クロノ:1}

{ID:2、タイプ: 'B'、クロノ:1}

{ID:3、タイプ: 'B'、クロノ:2}

{ID:4、タイプ: 'A'、クロノ:2}

{ID:5、種類: 'B'、クロノ:3}

...

フロントエンドには、私はnodeJS Serverはドキュメントの選択したタイプのためのDB内の最後のクロノ番号を探していて、1

を追加している

for (var i++; i < type.length; i++) // lets say Document type = ["a", "b"] 

     for (var j++; j< 100; j++) // Creates 100 documents 

     // Front end service request directing to the NodeJS Server to create a document 
serverDocument.createDocument(dataS).success(function(dataR){ 
         counterDOC++; 
$scope.documentID= dataR._id; 
} 

ループを使用

doc = new db.Document (req.body); // req.body is for example {type: 'a'} 
doc.save(); 

getChrono (doc); // home made function 

取得クロノ機能:

var getChrono = function(doc){ 

    var config= 
     { 

      type : doc.type, 

     } 

    query = db.Document.findOne(config).sort({$natural:-1}); 

    query.exec(function (err, chrn){ 

     doc.chrono = 1; 

     if (chrn != null) 

      if(chrn.chrono != null) 

      doc.chrono= chrn.chrono+1; 

     doc.update(); 

    }); 

{ID:1、タイプ: 'A'、クロノ:1}

{ID:2、タイプ: 'A'、クロノ:1}

その結果はと同様のものです

{ID:3、タイプ: 'A'、クロノ:1}

{ID:4、タイプ: 'A'、クロノ:1}

{ID:5、種類: 'A'、 chrono:2} ... もちろん、オブジェクトIDは一意ですが、年代順の番号はドキュメントの種類に固有のものではありません。

私は、情報がまだ次のリクエストが開始されたときにDBに保存されていないことを理解します。したがって、DB内の「最後のクロノ番号」は実際には最後のクロノ番号ではありません。

誰かがこの問題を解決する方法があります? 私は、フロントエンド側の同期ソリューションしたくない、あなたがsaveのでsaveDocの下chrono

をインクリメントした後ドキュメントが動作することができクロノ番号

+0

で関数を呼び出します。 – Dieterg

+0

こんにちはDieterg、私はフロントエンド側でそれをやりたいから2人のユーザーが同じ操作をしてしまうという問題は、バグにつながる可能性があります。そして、どうやってサーバサイドでそれを作るのか分かりません。私は機能が欠けている? – Alex

+0

この機能をサーバーに追加することもできます。 : - – Dieterg

答えて

0

を管理するために、サーバー側を持っている論理的だろう。

function saveDoc(docBody,callback){ 
    var query = db.Document.findOne({type:docBody.type}).sort({chrono:-1});// I guess $natural is not that reliable 
    query.exec(function (err, chrn){ 
     if(err) 
     return callback(err); 
     docBody.chrono = chrn && chrn.chrono != null?chrn.chrono+1:1; 

     var doc = new db.Document(docBody); // Doc created here after getting chrono 
     doc.save(callback); 
    }); 
} 

その後、あなたは同期方法であなたのアイテムを処理するためにキューをする必要がありますリクエストボディ

saveDoc(req.body,function(){ 
console.log('saved'); 
}); 
+0

こんにちはJagsSparrow ..私はプログラムであなたの機能を実装しましたが、結果は "同じ"です – Alex

+0

それはすべきであるので、chono番号は考慮されません。情報は読み取りと比較し、実際に新しい文書を保存する前に3/4入力を読み取ることができます。 – Alex

関連する問題