2017-04-03 4 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(); 
    }); 
}); 

cela ne récupère que le premier ensemble. Si j'ai deux nœuds dans mon tableau de req.body.product par exemple. Je ne récupère que le premier set. Mais j'ai besoin de tout récupérer non seulement d'une collection.res.send après deux forEach ont terminé l'exécution

+0

Y a-t-il une raison pour laquelle vous n'obtenez pas simplement tous les résultats dans une seule requête, par ex. '.find ({$ or: req.body.product.map (entry => ({Product: entrée}))})'? –

+0

Parfait. J'aime ça. Si vous aviez répondu à ma question. Je voterais ceci comme réponse. Merci! :) – mkteagle

+0

J'ai posté une réponse. S'il vous plaît laissez-moi savoir si cela fonctionne pour vous, car je ne pouvais pas réellement le tester (et je ne suis pas vraiment un utilisateur MongoDB). –

Répondre

1

Plutôt que d'effectuer deux requêtes et en combinant les résultats dans un tableau, je vous suggère d'effectuer une seule requête qui obtient tous les résultats, ressemblerait à quelque chose comme ceci:

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

Notez que je ne l'ai pas testé parce que je n'ai pas une base de données MongoDB devant moi.

+0

Cela fonctionne !!! Bien que je chaîne la requête de recherche avec une instruction de recherche de texte. – mkteagle

-1

votre mongoClient.connect() est asynchrone mais votre boucle s'exécute simplement sans attendre le rappel.

Essayez async boucle foreach: enter link description here

Cela devrait résoudre votre problème