Javascript Mongoose-获取得分最高的文档,但每个用户只有一个
这就是我的猫鼬模式的样子:Javascript Mongoose-获取得分最高的文档,但每个用户只有一个,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,这就是我的猫鼬模式的样子: const QuizModel = new mongoose.Schema({ quizId: { type: String, required: true, trim: true }, userId: { type: String, required: true, trim: true }, result: { score: { type: Number, required: true}, time: { type: Numb
const QuizModel = new mongoose.Schema({
quizId: { type: String, required: true, trim: true },
userId: { type: String, required: true, trim: true },
result: {
score: { type: Number, required: true},
time: { type: Number, required: true },
},
});
这是一个测验应用程序,因此有多个文档具有相同的用户ID
。
我试图提出一个查询,以建立排行榜,我想出了这个
const topUsers = await QuizModel.find({})
.sort({ "result.score": "desc", "result.time": "asc" })
.limit(10);
现在,因为我只想显示前10名用户,所以我添加了.limit(10)
。
现在,在这10个文档中,有可能所有10个文档都是相同的用户,即相同的userId
如何防止这种情况发生,并且仍然获得10个具有唯一用户ID的文档?
我不希望一个用户占据排行榜的所有10个位置
示例:
User1有5个以上模式的文档,分数分别为100、95、92、90、60
User2有5个以上模式的文档,得分分别为95、92、90、80、60
预期产出为:
[
{
quizId: "....",
userId: "user1",
result: {
score: 100,
time: "some_time"
}
},
{
quizId: "....",
userId: "user2",
result: {
score: 95,
time: "some_time"
}
}
]
您需要同时使用,以便汇总每个用户的分数,请尝试:
const topUsers = await QuizModel.aggregate([
{
$group: {
_id: "$userId",
score: { $max: "$result.score" }
}
},
{
$sort: { score: 1 }
},
{
$limit: 10
}
])
不,我不想要每个用户的总和。我只想要用户得分最高的文档。您的回答返回
[{u id:'thatUserId',score:236}]
@Dharmaraj在这种情况下您可以使用$max,谢谢您的帮助:)并且很抱歉,我是新加入聚合的。它工作得很好。如果我在$group
中添加任何其他字段,那么它将从文档中返回该字段,该字段的最大分数正确吗?@Dharmaraj无需,$group聚合数据,以便您可以返回$first,$last,$avg等。如果您希望从该文档中获得更多字段,请在$group之前按分数排序,然后使用$first/$last检索更多字段。谢谢:)我将详细介绍$
运算符