2017-04-03 57 views
1
const collect = []; 
req.body.product.forEach(function(entry) { 
    mongoClient.connect(databaseServerUrl, function(err, db) { 
     let testCollection = db.collection('Tests'); 
     testCollection.find({Product: entry}).toArray((err, docs) => { 
      let waiting = docs.length; 
      docs.forEach(function (doc) { 
       collect.push(doc); 
       finish(); 
      }); 
      function finish() { 
       waiting--; 
       if (waiting === 0) { 
        res.send(collect); 
       } 
      } 
     }); 
     db.close(); 
    }); 
}); 

這只是取回第一組。例如,如果我的req.body.product數組中有兩個節點。我只是回到第一盤。但我需要從一個Collection中取回所有的東西。res.send after for eachach have finished executed

+0

是不是有一個原因,你不只是在一個查詢中獲得所有結果,例如'.find({$ or:req.body.product.map(entry =>({Product:entry}))})'? –

+0

完美。我喜歡這個。如果你回答了我的問題。我會投票這個答案。謝謝! :) – mkteagle

+0

我已經發布了一個答案。請讓我知道它是否適用於您,因爲我無法真正測試它(並且我不是真正的MongoDB用戶)。 –

回答

1

不是執行兩個查詢,並將結果組合成一個陣列,我建議執行該得到的所有結果,單查詢其看起來像這樣:

mongoClient.connect(databaseServerUrl, function(err, db) { 
    const query = { $or: req.body.product.map(Product => ({ Product })) }; 
    db.collection('Tests').find(query).toArray((err, docs) => { 
     // ...handle `err` here... 
     res.send(docs); 
     db.close(); 
    }); 
}); 

請注意,我沒有測試過,因爲我沒有在我面前的MongoDB數據庫。

+0

這工作!儘管我使用文本搜索語句鏈接查找查詢。 – mkteagle

-1

你的mongoClient.connect()是異步的,但你的循環只是在不等待回調的情況下執行。

嘗試異步forEach循環:enter link description here

這倒是應該解決您的問題