我试图返回给定用户的评分列表,按类别进行过滤。
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 }}
);
答案 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);
});