2013-09-30 42 views
3

我想開發一個同步服務器(想:SVN就像),在一個請求中接受來自客戶端的一個或多個文檔(JSON字符串) (JS對象的JSON字符串化數組),將它們插入/更新到mongodb中併發送一個響應 - 這是一個包含每個文檔的插入/更新狀態(以及一些更多信息,如mongo中的_id)的JSON字符串。Node.js,MongoDB - 插入/更新多個文檔併發送一個響應

如果是一個文件,我可以做一個插入/更新,並在其回調中,我可以發送迴應。

collection.insert(_data, function(error, result) { 
    if(error) res.send('error'); 
    else res.send(JSON.stringify({result: result})); 
}); 

但是如何做到這一點,當我有多個文件。我可以在前一個回調中插入/更新一個文檔。但是我擔心如果我這樣做的話,我最終會遇到可怕的代碼階梯(我可以在一個函數中執行它,並且遞歸,是的)。

任何幫助將不勝感激。順便說一句,我使用這個驅動程序:http://mongodb.github.io/node-mongodb-native/

注意:我沒有看批處理插入或更新,因爲每個正在處理的文檔需要單獨處理。有些可能需要插入,一些更新,然後有版本號&同步狀態檢查等。

回答

5

您可能想嘗試async模塊。它有一些非常有用的方法來處理集合中的每個項目,併爲所有處理完成時提供功能。

我特別提到queue函數,它允許您將任務添加到隊列中,然後一旦處理了所有項目,就可以執行一些操作。

例如,你可能會做這樣的事情:

var q = async.queue(function(task, callback) { 
    // task.doc would contain your individual doc to process 

    // your insert/update logic goes here... 

    // Callback signifies you're done with this task 
    callback(); 

}, 2) // <--- this number specifies the number of tasks to run in parallel 

q.drain = function() { 
    // this is the queue's callback, called when the queue is empty, 
    // i.e. when all your documents have been processed. 

    res.send(statusCode, message); 
} 

然後,如果我們假設你有一個名爲可變文檔列表文檔,所有你需要做的處理它們是推他們到隊列中。

for (var doc in docs) { 
    q.push({ doc: docs[doc] }, function(err) { 
    if (err) console.log(err); 
    }) 
} 

普羅蒂普:你需要推含有將文檔放在隊列中的對象。如果您嘗試傳入展開的對象,則會出現奇怪的錯誤。

現在,如果您希望在Mongo中處理每個文檔的具體狀態,這是完全可能的。只要您在隊列外部實例化數據結構,您可以在處理每個項目時向其添加statusCodes(等),並將結構發送到隊列的漏極函數中的客戶端。不應該太麻煩。

+1

+1這正是我一直在尋找的。會試着讓你知道它是怎麼回事。 – techfoobar

+0

完美無瑕地工作。謝謝。 – techfoobar

+0

很高興聽到它:)異步是我最喜歡的模塊之一,並在我的所有項目中經常使用。對於這樣的事情來說非常方便。 – mattsch

相關問題