Je rencontre un problème lorsque j'essaie d'effectuer une requête en fonction du résultat d'une autre requête sur mongodb.Plusieurs requêtes dans la requête mongodb
J'essaie de faire une requête initiale et ensuite faire une autre requête pour chacun des résultats de la première requête. La raison pour laquelle je le fais est parce que j'ai deux collections différentes et j'ai besoin de joindre des données d'une collection avec les données de l'autre collection. Dans un monde SQL, je pourrais facilement faire cela avec un JOIN, mais comme j'utilise mongodb dans celui-ci, je ne peux pas vraiment utiliser JOINs, donc j'ai deviné faire une boucle for dans la fonction de rappel de la première requête. .
Voici le code que je utilise ...
var resultSet = [];
db.get('busstopcollection').find({id_bus_stop: parseInt(req.body.busstopid)}, function(e, docs){
if(e || docs.length === 0) {
console.log("Sorry, wrong id.");
return e;
}
for(var m=0; m<docs.length; m++){
var auxRes = {};
auxRes.id_bus = docs[m].id_bus;
auxRes.id_bus_stop = docs[m].id_bus_stop;
auxRes.coord_x = docs[m].coord_x;
auxRes.coord_y = docs[m].coord_y;
auxRes.id_bus_variation = docs[m].id_bus_variation;
db.get('buscollection').find({id_bus: parseInt(docs[m].id_bus)}, function(e, busDocs){
auxRes.s_origin_description = busDocs[0].s_origin_description;
auxRes.s_destination_description = busDocs[0].id_destination_description;
resultSet.push(auxRes);
});
res.send(JSON.stringify(resultSet));
}
});
Je dois res.send
le tableau de resultSet après toutes les valeurs ont été ajoutées.
J'ai essayé d'autres façons de faire cela, mais le fait est que lorsque la ligne res.send
est atteinte, la deuxième requête n'est pas terminée du tout. J'ai aussi essayé de le faire à l'intérieur du callback de la requête interne, mais je dois vérifier si c'est la dernière dans la boucle for, et vérifier la valeur o m ne le fera pas car il est toujours équivalent à docs.length
. Pour autant que je sache, il n'y a pas de requête synchrone dans mongodb, mais peut-être que je me trompe.
Quelle est la bonne façon de faire cela?
EDIT
J'ai trouvé un moyen de contourner cela, mais je suis sûr qu'il doit y avoir une meilleure façon. Voici comment je le fais ...
db.get('busstopcollection').find({id_bus_stop: parseInt(req.body.busstopid)}, function(e, docs){
if(e || docs.length === 0) {
console.log("Ha ocurrido un error, no existe esa parada");
return e;
}
var busIDs = [];
for(var m=0; m<docs.length; m++){
busIDs.push(parseInt(docs[m].id_bus));
var auxRes = {};
auxRes.id_bus = docs[m].id_bus;
auxRes.id_bus_stop = docs[m].id_bus_stop;
auxRes.coord_x = docs[m].coord_x;
auxRes.coord_y = docs[m].coord_y;
auxRes.id_bus_variation = docs[m].id_bus_variation;
resultSet.push(auxRes);
}
db.get('buscollection').find({id_bus: {$in: busIDs}}, function(e, busDocs){
for(var n = 0; n<busDocs.length; n++){
for(var k=0; k<resultSet.length; k++){
if(resultSet[k].id_bus == busDocs[n].id_bus){
resultSet[k].s_origin_description = busDocs[n].s_origin_description;
resultSet[k].s_destination_description = busDocs[n].id_destination_description;
}
}
}
res.send(JSON.stringify(resultSet));
});
});
Ouais, c'est en fait ce que je pensais trop. Je suppose qu'il n'y a pas d'autre moyen de le faire alors. Merci pour votre réponse! – lascort
vous pouvez utiliser la récursivité, mais encore une fois, vous interrogerez mongodb plusieurs fois. – Sumeet