0

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

我正在尝试在我的server.js代码中调用嵌套查询。它不起作用,因为res.json(data)在修改数据元素之前调用。我怀疑有一种方法可以在我的代码中使用嵌套查询(或使用类似forEachor的东西)来做我想做的事,但是我缺乏 JavaScript/Mongo 经验并没有让我找到一个好的解决方案。aggregatedb.js

任何帮助,将不胜感激。

服务器.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);
        }
    });
});

数据库.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);
} 
4

2 回答 2

2

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

  1. 使用 async.js https://github.com/caolan/async
  2. 使用承诺https://github.com/kriskowal/q

我建议您从 async 开始,因为它更接近当前代码

于 2014-05-16T15:20:39.393 回答
0

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

在执行 res.json(data); 之前,您需要一个回调或检查以确保 for 循环已完成。

你也应该设置 data[i]["visited"] = "true" 或 false 而不是设置 rec,因为 rec 是一个单独的变量,你不会返回

于 2014-05-16T14:35:48.613 回答