我需要创建一个MongoDB查询,并为每个结果添加一个额外的字段。字段值取决于另一个查询的结果。
我试图在我的server.js
代码中调用嵌套查询。它不起作用,因为在修改数据元素之前调用了res.json(data)
。我怀疑在我的forEach
代码中使用嵌套查询(或使用aggregate
或db.js
之类的东西)可以做我想做的事情,但我缺乏JavaScript经验/ Mongo没有让我找到一个好的解决方案。
任何帮助都将不胜感激。
server.js
app.get("/get_users_list", function(req, res) {
db.getUsersByCity(req.query.city, function(err, data) {
if (err) {
res.send(err);
} else {
for(var i in data) {
var rec = data[i];
db.checkVisitation({'user_id': req.query.user_id, 'friend_id': rec.user_id},
function(inner_err, inner_data) {
if (inner_data) {
rec["visited"] = "true";
} else {
rec["visited"] = "false";
}
});
}
res.json(data);
}
});
});
db.js
var checkVisitation = function(visitJSON, callback) {
db.visitations.findOne(visitJSON, callback);
}
var getUsersByCity = function(city, callback) {
db.users.find({'city': city}).toArray(callback);
}
修改
我能够通过在内部回调中添加一个检查来解决问题:
if (i == data.length - 1) {
res.json(data);
}
答案 0 :(得分:2)
只有在收到db的所有响应后才需要调用res.json。由于请求是异步的,因此您需要组织代码以等待它们完成。有两种广泛采用的方法来组织具有异步调用的代码:
我建议您从async开始,因为它更接近当前代码
答案 1 :(得分:0)
你的for循环中有res.json(data),因此它将在for循环的第一个增量中发送数据 - 而不是在循环结束时。
你需要回调或检查以确保在执行res.json(数据)之前完成for循环;
你也应该设置数据[i] ["访问"] =" true"或者假设而不是设置rec,因为rec是一个你没有返回的单独变量