async.map 未按预期工作

async.map not working as expected

我正在尝试遍历一个集合并从相关集合中附加一个对象数组。我得到的结果不包含该数组。 谁能帮我找出问题所在?

模特关系佩奇有很多问题

问题架构:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

    var questionSchema = new Schema({
        _poll                  : { type: Schema.Types.ObjectId, ref: 'Poll' },
        _page                   : { type: Schema.Types.ObjectId, ref: 'Page' },  
        type                    : { type : String, required: true },  
        title                   : { type : String, required: true },  
        required                : { type : Boolean },  
        help_text               : { type : String },   
    },
    { timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' } 
    });

    mongoose.model('Question', questionSchema);

页面架构:

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

var pageSchema = new Schema({
    _poll              : { type: Schema.Types.ObjectId, ref: 'Poll' },
    title              : { type : String, required: true },  
    intro              : { type : String },  
    list_style_type    : { type : String },  
},
{ timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' } 
});

mongoose.model('Page', pageSchema);

路线

索引:函数(请求、资源、下一个){

Poll.findOne({_id: req.params.poll_id}, function(err, poll){
  if(err) return next(err);

  Page.find({_poll: poll.id}, function(err, pages){
    if(err) return next(err);

    async.map(pages, function(p, done) {
      Question.find({_page: p._id}, function(err, q){
        if(err) return next(err);
        p.questions = q;   //  <-- SHOULDN'T THIS WORK? //
        done(null, pages);
      });
    }, function(err, result) {
      if(err) return next(err);
      res.status(200).json(pages);
    })

  });
});

},

我得到的结果:

[
    {
    _id: "57d960fb569dc4101a83525e",
    updated_at: "2016-09-14T14:38:51.113Z",
    created_at: "2016-09-14T14:38:51.113Z",
    _poll: "57c88775992af4c84f99c5d0",
    title: "test section",
    list_style_type: "lower-roman",
    __v: 0
    },
    {
    _id: "57d9691e22eb81583e20a1c1",
    updated_at: "2016-09-14T15:13:34.244Z",
    created_at: "2016-09-14T15:13:34.244Z",
    _poll: "57c88775992af4c84f99c5d0",
    title: "this is a new page",
    list_style_type: "lower-roman",
    intro: "jkc hcsad",
    __v: 0
    },
    {
    _id: "57d9a97d1e7863b81f9e4d0e",
    updated_at: "2016-09-14T19:48:13.816Z",
    created_at: "2016-09-14T19:48:13.816Z",
    _poll: "57c88775992af4c84f99c5d0",
    title: "Consequatur Vero necessitatibus consequatur hic",
    list_style_type: "upper-latin",
    intro: "Rem laboris est omnis ducimus, minim autem itaque minim dolore ea odio aliqua. Autem qui id, sit nulla id.",
    __v: 0
    },
    {
    _id: "57dab7d7f54387d41d976614",
    updated_at: "2016-09-15T15:01:44.001Z",
    created_at: "2016-09-15T15:01:44.001Z",
    _poll: "57c88775992af4c84f99c5d0",
    title: "This is a new page",
    list_style_type: "lower-roman",
    intro: "cjksahc dsa",
    __v: 0
    }
]

我希望返回的对象包含数组 "questions" 但不知何故它不存在。

提前致谢!!

可能在您的 "Route" 代码中,传递给回调的变量有误。 我认为 done(null, pages) 应该是 done(null, p)res.status(200).json(pages) 应该是 res.status(200).json(result).

并且由于 mongoose 会忽略架构中不存在的字段,因此 questions 不会出现在您的结果中。 在您的 "Route" 代码中,p 是一个猫鼬文档,您可以通过 .toObject().

将其转换为普通的 javascript 对象

所以也许您可以通过将您的代码替换为

来获得 questions 的结果:
async.map(pages, function(p, done) {
  Question.find({_page: p._id}, function(err, q){
    if(err) return next(err);
    p = p.toObject();  // convert a mongoose document into a javascript object
    p.questions = q;
    done(null, p);  // modified 'pages' -> 'p'
  });
}, function(err, result) {
  if(err) return next(err);
  res.status(200).json(result);  // modified 'pages' -> 'result'
})