使用mongojs添加依赖于其他查询的额外字段来查询mongodb中的结果

时间:2014-05-16 14:22:59

标签: javascript node.js mongodb mongojs

我需要创建一个MongoDB查询,并为每个结果添加一个额外的字段。字段值取决于另一个查询的结果。

我试图在我的server.js代码中调用嵌套查询。它不起作用,因为在修改数据元素之前调用了res.json(data)。我怀疑在我的forEach代码中使用嵌套查询(或使用aggregatedb.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);
} 

2 个答案:

答案 0 :(得分:2)

只有在收到db的所有响应后才需要调用res.json。由于请求是异步的,因此您需要组织代码以等待它们完成。有两种广泛采用的方法来组织具有异步调用的代码:

  1. 使用async.js https://github.com/caolan/async
  2. 使用promises https://github.com/kriskowal/q
  3. 我建议您从async开始,因为它更接近当前代码

答案 1 :(得分:0)

你的for循环中有res.json(data),因此它将在for循环的第一个增量中发送数据 - 而不是在循环结束时。

你需要回调或检查以确保在执行res.json(数据)之前完成for循环;

你也应该设置数据[i] ["访问"] =" true"或者假设而不是设置rec,因为rec是一个你没有返回的单独变量