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检索更多字段。谢谢:)我将详细介绍
$
运算符