过滤包含对象数组的mongoose中的子文档

时间:2015-05-28 17:15:18

标签: node.js mongodb mongoose

我试图返回给定用户的评分列表,按类别进行过滤。

var UserSchema = new Schema({
...
ratings: [{
  item: { type: Schema.Types.ObjectId, ref: 'Items' },
  category: String,
  rating: Number
}]

如果我执行以下操作,我只会获得该类别的第一个评级:

var query = User.findOne(userId, 'ratings');
query.select({ 'ratings': { $elemMatch: { 'category': req.query.category }}});

以下内容也只返回第一个评分:

var query = User.find();
query.where({'_id': userId, 'ratings.category': req.query.category});
query.select({ 'ratings.$': 1 });

我能够使用以下内容汇总正确的结果,但是,我认为这不会起作用,因为我不能在聚合后填充。

var query = User.aggregate(
  { $match: { _id: userId }},
  { $project: { _id: 1, ratings: 1 }},
  { $unwind: '$ratings' },
  { $match: { 'ratings.category': req.query.category }}
);

1 个答案:

答案 0 :(得分:2)

您可以在汇总后执行 population ,如下所示:

var pipeline = [
  { $match: { _id: userId }},
  { $project: { _id: 1, ratings: 1 }},
  { $unwind: '$ratings' },
  { $match: { 'ratings.category': req.query.category } }
];

User.aggregate(pipeline, function (err, result){
    User.populate(result, {path: "ratings.item"}, callback);  
});