我在嘗試根據mongodb上的另一個查詢的結果進行查詢時遇到問題。mongodb查詢中的多個查詢
我試圖做一個初始查詢,然後對每個第一個查詢的結果做另一個查詢。我這樣做的原因是因爲我有兩個不同的集合,我需要從一個集合中加入一些數據與其他集合的數據。在一個SQL世界中,我可以用JOIN輕鬆做到這一點,但是因爲我在這個中使用了mongodb,所以我不能真正使用JOIN,所以我猜想在第一個查詢的回調函數內部做一個for循環是要走的路。
下面是我使用的代碼...
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));
}
});
我需要res.send
結果集陣列已加入所有的值之後。
我已經嘗試了一些其他的方式來做到這一點,但事情是,當res.send
行到達第二個查詢還沒有完成。我也嘗試在內部查詢的回調中做這件事,但我需要檢查它是否是for循環中的最後一個,並且檢查值o m將不會執行它,因爲它總是等於docs.length
。
據我所知,在mongodb中沒有同步查詢這樣的事情,但也許我錯了。
這樣做的正確方法是什麼?
編輯
我找到辦法解決它,但我敢肯定,我們有了一個更好的辦法。以下是我如何做...
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));
});
});
是啊,這其實是我想通了太多。那麼我想沒有其他的方式了。感謝您的回答! – lascort
你可以使用遞歸,但是你會再次查詢mongodb。 – Sumeet