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

Add extra fields dependent of other query to query result in mongodb, using mongojs

本文关键字:查询 mongodb 使用 mongojs 结果 字段 依赖于 其他 添加      更新时间:2023-09-26

我需要做一个MongoDB查询,并为我的每一个结果添加一个额外的字段。字段值依赖于另一个查询的结果。

我试图在我的server.js代码中调用嵌套查询。它不能工作,因为在修改数据元素之前调用了res.json(data)。我怀疑有一种方法可以在我的db.js代码中使用嵌套查询(或使用forEachaggregate之类的东西)来做我想做的事情,但是我缺乏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);
} 

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

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

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

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

在执行res.json(data);

之前,您需要一个回调或检查以确保for循环完成。

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