0

使用 Node.js 僧侣和 MongoDB,我想模仿一个表连接:

  1. 在集合 A 上进行查找
  2. 对于每个结果 X,在集合 B 中查找,并更新 X
  3. 返回更新的结果列表

僧侣中数据库命令的异步性质给我带来了麻烦。这是我的初始代码。它不起作用,因为第二次调用find立即返回一个承诺,并且结果在xs响应中发送,然后才能更新。

var db = require('monk')('localhost/mydb');
db.get('collection').find({}, function(e,xs) {
  xs.forEach(function(x){
    coll_b.find({a_id:x._id}, function(e,bs) {
      a['bs'] = bs;
    });
  });
  res.json({'results':as});
});

我觉得我应该在这里使用承诺链,但我不知道该怎么做。任何帮助将不胜感激。

4

1 回答 1

1

我想我以这种方式解决了它,受到这个答案的启发:

var db = require('monk')('localhost/mydb');

// Initial find
db.get('collection').find({}, function(e,xs) {

  // Get inner finds as a list of functions which return promises
  var tasks = xs.map(function(x){
    return function() {
      return coll_b.find({a_id:x._id}, function(e,bs) {
        a['bs'] = bs;
      });
    }
  });

  // Chain tasks together
  var p = tasks[0](); // start the first one
  for(var i = 1; i < tasks.length; i++) p = p.then(tasks[i]);

  // After all tasks are done, output results
  p.then(function(_x){
    res.json({'results':xs});
  });

});

我仍然觉得可以通过使用来最小化这段代码chain(),但至少这可以按预期工作。

注意:我意识到对每个结果执行第二次查找不一定有效,但这不是我关心的问题。

于 2015-07-14T14:06:34.627 回答