【发布时间】:2014-04-18 19:48:16
【问题描述】:
我在尝试根据 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.sendresultSet 数组。
我尝试了其他一些方法,但问题是当到达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));
});
});
【问题讨论】:
标签: node.js mongodb synchronous nosql