聚合和查找

时间:2016-09-06 10:47:05

标签: node.js mongodb express mongoose aggregation-framework

我正在尝试对mongoose查询进行分组,并使用$ lookup在mongoose中填充一些子文档,但我的结果文档数组返回为空。 谁能告诉我为什么?

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

var answerSchema = new Schema({
  _user               : { type: Schema.Types.ObjectId, ref: 'User', required: true },
  _poll               : { type: Schema.Types.ObjectId, ref: 'Poll', required: true },
  _question           : [{ type: Schema.Types.ObjectId, ref: 'Question' }],
  answer              : { type : String },
  },
  { timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' } 
});

mongoose.model('Answer', answerSchema);

这是我的代码:

module.exports = {

  index: function(req, res, next){

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

    console.log(poll);

    Answer.aggregate([
        {$unwind: "$_question"},
        {$match: {_poll: poll._id}},
        {$group: {
            _id: '$_question',
        }},
        {
          $lookup : { 
            from : 'polls', 
            localField : '_poll', 
            foreignField: '_id', 
            as: 'poll' 
          },
        },
        {
          $lookup : { 
            from : 'questions', 
            localField : '_question', 
            foreignField: '_id', 
            as: 'questions'   
          },
        },
        {
          $lookup : { 
            from : 'users', 
            localField : '_user', 
            foreignField: '_id', 
            as: 'user' 
          },
        },
    ], function (err, result) {
         res.status(200).json(result);
    });

    });
  },

由于某种原因,新的子文档将返回空。 请注意,每个答案都包含对一个民意调查,一个用户和多个问题的引用。

[
{
_id: "57ce8927ea5a4f090774215d",
poll: [ ],
questions: [ ],
user: [ ]
}
]

有人能发现我的错误吗?

我应该使用$ project吗?我听说$ lookup是新的更好的方法。我使用的是mongo 3.2.0和mongoose 4.5.8。

1 个答案:

答案 0 :(得分:1)

Mongdb聚合查询是一个管道操作。因此,后续查询的结果将传递给下一个查询。有关Mongodb聚合的更多信息,请参阅this。您所犯的错误是,当您使用$group查询时,只会将_id传递给下一个$lookup查询。您可以使用以下查询来解决此问题。

Answer.aggregate([
    {$unwind: "$_question"},
    {$match: {_poll: poll._id}},
    {$group: {
        _id: '$_question',
        _poll: { $first: '$_poll'},
        _user: { $first: '$_user'},
        _question : { $first: "$_question "}
    }},
    {
      $lookup : { 
        from : 'polls', 
        localField : '_poll', 
        foreignField: '_id', 
        as: 'poll' 
      },
    },
    {
      $lookup : { 
        from : 'questions', 
        localField : '_question', 
        foreignField: '_id', 
        as: 'questions'   
      },
    },
    {
      $lookup : { 
        from : 'users', 
        localField : '_user', 
        foreignField: '_id', 
        as: 'user' 
      },
    },
], function (err, result) {
     res.status(200).json(result);
});