2016-11-21 23 views
2

可以說我有一個處理N個用戶的腳本。腳本可以看兩種方法之一,假設資源充足,速度更快?我可以使用Promise.allasync.parallel在Node.js中使用MongoDB進行擴展,我應該什麼時候一次查詢所有的ID,並且同時查詢每個ID?

選項1個

function processUsers(userIds) { 
    monog.find({_id: { $in: userIds }, (userDocs) => { 
     const tasks = userDocs.map((userDoc) => processUser(userDoc)) 
     async.parallel(tasks, (err, results) => console.log('finished')) 
    }); 
} 

選項2

function processUsers(userIds) { 
    const tasks = userIds.map((userId) => { 
     mongo.findOne({_id: userId}, (err, userDoc) => { 
      processUser(userDoc); 
     }) 
    }) 
    async.parallel(tasks, (err, results) => console.log('finished')) 
} 
+1

在選項2中,您正在執行更多的數據庫請求,這將比單個查詢花費更多的時間。這是一個詭計問題嗎? :-) –

回答

0

最好的辦法是閱讀所有在一次或至少在大塊閱讀。絕對不要逐一閱讀,這將是很多不必要的數據庫流量。如果您認爲自己有足夠的內存,請立即閱讀。

此外,隨機想法,但如果processUser涉及數據庫寫入,您可以收集結果並使用bulkWrite來加速事情甚至更多。

0

選項1似乎是一個更好的選擇國際海事組織。 find()執行得比findOne()更好,因爲當使用find()時,您將返回一個遊標而不是數據庫中的實際數據。遍歷此光標將比使用findOne()單獨檢索每個文檔給出更好的結果。

0

我會說這取決於。

問題的兩個操作:查詢(find/findOne)和數據處理(processUser()) - 根據哪一個在實際虛擬機中需要更多工作,您可能希望使它們利用異步行爲Node.js的例如,如果find()的處理時間大約是幾秒鐘,那麼你會希望使進程異步,因爲你不想將它們排序以增加整個時間。

雖然通常db查詢是I/O綁定的並且比內存綁定操作耗時更多,但我們必須實際看到工作負載的特定性,並相應地接聽電話。

希望這會有所幫助。

相關問題