2016-06-28 34 views
0

對於這意味着Stack項目的信息,我想在同一個集合文件保存:保存同步(不重複)的異步進程

  • 不同類型的每種類型
  • 獨特的時間數。

例如:

{ID:1,類型: 'A',計時:1}

{ID:2,類型: 'B',計時:1}

{ID:3,類型: 'b',計時:2}

{ID:4,類型: 'A',計時:2}

{ID:5,類型: 'b',計時:3}

...

在前端,我使用的是循環

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; 
} 

的服務器的NodeJS在DB尋找最後的計時號文件所選擇的類型,並添加1

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中的'最後一個計時碼'並不是現實中最後一個計時碼。

有人可以有一種方法來解決這個問題? 我不想在前端側的同步解決方案,這將是合乎邏輯的有服務器端來管理計時數

+0

你需要一個隊列來處理同步的方式您的項目。 – Dieterg

+0

嗨Dieterg,我不想在前端做這件事,因爲讓2個用戶做同樣的操作的問題可能會導致一個錯誤..我不知道如何使它在服務器端..也許我想念一個功能? – Alex

+0

您也可以在服務器上添加此功能。 : - – Dieterg

回答

0

您可以在下面saveDoc遞增chrono

所以經過save DOC將工作。

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 ..我在程序中實現你的功能,但結果是「相同」chono號碼沒有考慮到,因爲它應該是 – Alex

+0

它看起來像電腦花費太多的時間來保存信息與讀取相比,它可以在實際上可以保存新文檔之前讀取3/4個輸入。 – Alex