2017-04-03 7 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の配列に2つのノードがある場合などです。私は最初のセットを取り戻すだけです。しかし、私は1つのコレクションだけでなく、すべてを取り戻す必要があります。2つのforEachの後にres.sendが実行を完了しました

+0

単一のクエリですべての結果を取得するだけの理由はありませんか。 '.find({$ or:req.body.product.map(entry =>({Product:entry}))})'? –

+0

パーフェクト。私はこれが好き。あなたが私の質問に答えていれば。私はこれを答えとして投票します。ありがとう! :) – mkteagle

+0

私は答えを投稿しました。私が実際にそれをテストすることができなかったので(そして、私は本当にMongoDBのユーザーではないので)、あなたのために働くのかどうか教えてください。 –

答えて

1

を解決する必要があり、私は結果のすべてを取得する単一のクエリを実行する提案、どの私は私の目の前でのMongoDBデータベースを持っていないので、私はこれをテストしていません

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

注:このようになります。

+0

これは動作します!!!私は、テキスト検索文で検索クエリを連鎖していますが。 – mkteagle

-1

あなたmongoClient.connect()はasyncronousですが、あなたのループは、ちょうど、コールバックを待たずに実行されます。 foreachループ非同期

試してみてください。enter link description here

これはむしろ2つのクエリを実行し、1つの配列に結果を組み合わせることよりも、あなたの問題

関連する問題