我是node.js的新手,目前正在使用keystonejs cms和MongoDB开展项目。现在我陷入了获取与多个集合相关的数据的困境。由于这个回调函数,我无法返回带有关系数据的数组。我的代码与此示例代码类似。
var getAgenda = function(id, callback){
callback = callback || function(){};
if(id){
AgendaDay.model.find({summit:id}).exec(function (err, results3) {
var arr_agenda = [];
var arr_agenda_item = [];
for(var key3 in results3){
AgendaItem.model.find({agendaDay:results3[key3]._id}).exec(function (err, results2){
for(var key2 in results2){
arr_agenda_item.push(
{
item_id: results2[key2]._id,
item_name: results2[key2].name,
from_time: results2[key2].time_from,
to_time: results2[key2].time_to,
desc: results2[key2].description,
fatured: results2[key2].featured,
}
);
}
arr_agenda.push(
{
name: results3[key3].name,
date: results3[key3].date,
description: results3[key3].description,
item_list:arr_agenda_item
}
);
return callback(arr_agenda);
});
}
});
}
}
exports.list = function (req, res) {
var mainarray = [];
Summit.model.find().exec(function (err, resultssummit) {
if (err) return res.json({ err: err });
if (!resultssummit) return res.json('not found');
Guest.model.find().exec(function (err, resultsguset) {
for(var key in resultssummit){
var agen_arr = [];
for(var i=0; i<resultssummit[key].guests.length; i++){
var sumid = resultssummit[key]._id;
//this is the function im trying get data and assign to mainarray
getAgenda(sumid, function(arr_agenda){
agen_arr = arr_agenda;
});
mainarray.push(
{
id: resultssummit[key]._id,
name: resultssummit[key].name,
agenda_data: agen_arr,
}
);
}
res.json({
summit: mainarray,
});
}
});
}
}
如果有人可以帮助我,那真的很棒:)
答案 0 :(得分:0)
你需要对整个事情进行重组。您不应该在for循环中调用mongo查询并期望在循环结束时输出它们。此外,您的响应是for循环。那不行。
我会告诉你怎么做。我不能为你重构所有代码。
不是将mongodb查询放在for循环中,而是需要在单个查询中进行转换。只需将_id
放在一个数组中,然后触发一个查询。
AgendaItem.model.find({agendaDay:{$in:ARRAY_OF_IDS}})
你也需要为AgendaDay.model.find({summit:id})
做同样的事情。