我有一个场景,我有一个名为ratings
的数组中的等级和轮次
我需要根据轮次(1,2,3,4)按降序对评级进行排序。
我正在使用快速js和mongoose驱动程序进行查询
查询:
**//Get top ratings based on round
exports.topRating = function(req, res) {
console.log(req.query);
Profiles.aggregate([{
$match: {
"hiringManager": req.query.hiringManager,
"ratings.round":parseInt(req.query.round)
}
},{ $sort : { "ratings.rating" : -1 } }],
function(err, profiles) {
if (err) {
return handleError(res, err);
}
console.log(profiles);
return res.status(200).json(fnStruncturedData(profiles));
});
};
架构:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var ProfilesSchema = new Schema({
name:String,
ratings: [{
round: Number,
rating: Number,
feedback: String,
interviewer: String,
roundStatus: String
}]
})
假设我的数据存储在db中,如下所示
[{
name:"a",
ratings:[{
round: 1,
rating: 3,
feedback: "something",
interviewer: "abc",
roundStatus: "selected"
},
{
round: 2,
rating: 5,
feedback: "something",
interviewer: "abc",
roundStatus: "selected"
},
{
round: 3,
rating: 4,
feedback: "something",
interviewer: "abc",
roundStatus: "selected"
},{
round: 4,
rating: 1,
feedback: "something",
interviewer: "abc",
roundStatus: "selected"
}]
},
{
name:"b",
ratings:[{
round: 1,
rating: 5,
feedback: "something",
interviewer: "abc",
roundStatus: "selected"
},
{
round: 2,
rating: 4,
feedback: "something",
interviewer: "abc",
roundStatus: "selected"
},
{
round: 3,
rating: 3,
feedback: "something",
interviewer: "abc",
roundStatus: "selected"
},{
round: 4,
rating: 2,
feedback: "something",
interviewer: "abc",
roundStatus: "selected"
}]
}]
我在客户端放下adrop,用户选择轮次,因此会出现最高评级。
比如圆一:
对数据进行排序,根据查询,我首先在数组中获取name:b
数据
第二轮:
我应该先在数组中获得name:a
,但它会再次显示name:b
个数据
在这里,我可以完美地排列1个等级,而圆形(2,3,4)显示没有变化
我不明白查询中有什么不对
请帮忙
答案 0 :(得分:0)
问题在于,您不感兴趣的回合中的数据仍然包含在内,并且正在影响您的排序阶段。
如果不需要返回来自其他轮次的数据,一个简单的解决方案是首先展开评级,然后排除$ match阶段中所有不匹配的轮次。
例如,这应该有效:
[
{
$unwind: "$ratings"
},
{
$match: {
"hiringManager": req.query.hiringManager,
"ratings.round":parseInt(req.query.round)
}
},
{
$sort: {
"ratings.rating" : -1
}
}
]