Node.js mongoose如何填充非id字段或如何手动实现并行承诺填充

Node.js mongoose如何填充非id字段或如何手动实现并行承诺填充,node.js,mongoose,promise,generator,bluebird,Node.js,Mongoose,Promise,Generator,Bluebird,我想用mongoose填充一个非id字段,在这里已经找到了以下问题: 原来mongoose现在不支持这个功能。这里的公开问题是: 现在,我想手动填充额外的查询。但是我在做这件事时遇到了一些问题 我有两个模式(回复、用户): 这是回复模式,作者id引用的是用户集合的用户名字段,而不是用户id var ReplySchema = new Schema({ 'content' : { type: String, required: true }, 'author_id

我想用mongoose填充一个非id字段,在这里已经找到了以下问题:

原来mongoose现在不支持这个功能。这里的公开问题是:

现在,我想手动填充额外的查询。但是我在做这件事时遇到了一些问题

我有两个模式(回复、用户):

这是回复模式,作者id引用的是用户集合的用户名字段,而不是用户id

var ReplySchema = new Schema({
  'content' : {
    type: String,
    required: true

  },
  'author_id' : {
    type:  String,
    ref: 'users'
  },
});
当我收到全部回复时。比如:

replies [ {
    content: 'comments one',
    author_id: 'raynlon',
    },
  { 
    content: 'comments two',
    author_id: 'raynlon',
  } ]
从这里开始,我将进一步从用户表中查询作者,我所做的是:

 var replies = yield query.exec(); // which already got all the replies  
    var final = [];  

   for (var i = 0; i < replies.length; i++) {
    co(function*(){
      var data = yield User.Model.findOne({username: replies[i].author_id}).select('username email avatar gravatar_id name').exec();
      return data;
    }).then(function(value) {
      final.push(value);
    });
  }

    return final // I need to return the modified data back to the client
var repress=yield query.exec();//已经收到了所有的回复
var final=[];
for(var i=0;i
我总是空着

这是由于for循环中的异步代码造成的

我还找到了一些解决方案,如: Promise.all(),q.all() 这些类似的承诺

但是我不知道该怎么做


我使用的co库说co()应该作为承诺返回,理论上,我们可以将其注入到promise.all([]),但它不起作用……所以有人能帮我吗

好的,问题是:您创建了变量
final
,并在战后返回它,这发生在Mongo查询执行之前

解决方案:您应该将承诺推送到
final
,然后在回复客户时一起解决

函数queryAsync(){
var repress=yield query.exec();//已获得所有回复
var final=[];
for(var i=0;i