多个mongoose调用异步

时间:2016-10-13 13:27:39

标签: node.js mongodb asynchronous mongoose

我是节点 mongoose 的新人。 我做多个查询来查找我的数据,所以我使用 async 来填充数组,然后将其发送回客户端。

我尝试从我找到的游戏中获取所有统计数据。

这是我的架构:[团队] 1 ---> N [游戏] 1 ---> N [统计]

var json = []; // The variable I will send back

async.waterfall([
  function( team, next ) { // Find all games from a team (with its id)
    dbGame.find({ team_id: req.params._id }).exec( next );
  },
  function( games, next ) {
    for (key in games) {   // For all games, finds their stats 
      dbStat.find({ game_id: games[key]._id }).exec(function(err, stats) {
        json.push({
          _id       : games[key]._id,
          stats     : stats
        }); // The json I need to return
      });
      if ( Number(key) === Number(games.length -1) ) {
        next(json);
      }
    }
  }
], function () {
  res.status(200);
  res.json(json);
});

变量 json 发送始终为空,因为异步并且我不知道如何使用完整的变量。

更新#1

好吧,它的工作很酷。

但只是一个麻烦,所有的统计数据都在对象的所有json中:

问题:所有游戏的统计数据都存储在所有json中。

[{
 _id:"57cb15f73945ac9808fe5422",
 stats:Array[13]
}, {
 _id:"57ff76fd78ca91a17b25dd1b",
 stats :Array[13]
}]

但我想我可以排序。现在这是我的代码:

async.waterfall([
  function(next) { // Find all games from a team (with its id)
    dbGame.find({
      team_id: req.params._id
    }).sort({
      _id: 1
    }).exec(next);
  },
  function(games, next) {
    var gameIds = games.map(function(game) {
      return game._id;
    });
    dbStat.find({
      game_id: {
        $in: gameIds
      }
    }).sort({game_id: 1}).exec(function(err, stats) {
      json = gameIds.map(function (id) {
        return {
          _id: id,
            stats: stats
          }
        });
        next(err, json);
    });
  }
], function(err, json) {
  jsonResponse(res, 200, json);
});

2 个答案:

答案 0 :(得分:0)

尝试以下:

var json = []; // The variable I will send back

async.waterfall([
    function(team, next) { // Find all games from a team (with its id)
        dbGame.find({
            team_id: req.params._id
        }).sort({
            _id: 1
        }).exec(next);
    },
    function(games, next) {
        var gameIds = games.map(function(game) {
            return game._id;
        });

        dbStat.find({
            game_id: {
                $in: gameIds
            }
        }).sort({game_id: 1}).exec(function(err, stats) {
          json = gameIds.map(function (id) {
            return {
              _id: id,
              stats: stats
            }
          });
          next(err, json);
        });
    }
], function() {
    res.status(200);
    res.json(json);
});

评论是否有任何问题或我遗漏了一些内容,因为我没有测试过。

答案 1 :(得分:-1)

您不是passing the results of the first find to the next step of waterfall,当您调用next(json);时,您将json作为错误传递,因为第一个参数是错误。尝试:

async.waterfall([
    function(team, next) { // Find all games from a team (with its id)
        dbGame.find({
            team_id: req.params._id
        }).sort({
            _id: 1
        }).exec(next(err, games));
    },
    function(games, next) {
        var gameIds = games.map(function(game) {
            return game._id;
        });

        dbStat.find({
            game_id: {
                $in: gameIds
            }
        }).sort({game_id: 1}).exec(function(err, stats) {
          json = gameIds.map(function (id) {
            return {
              _id: id,
              stats: stats
            }
          });
          next(err, json);
        });
    }
], function(err, json) {
    res.status(200);
    res.json(json);
});