Mongo分组取每组最大的一条记录

使用Spring-data-mongo统计每个班级最高成绩 classIds为List集合


Criteria criteria = Criteria.where("classId").in(classIds);


GroupOperation groupOperation = Aggregation.group("classId").max("score").as("score");


Aggregation agg = Aggregation.newAggregation(ClassScore.class,Aggregation.match(criteria),groupOperation);


AggregationResults<Map> results = mongoTemplate.aggregate(agg,ClassScore.class,Map.class);


 Map<String, Double> classMaxScoreMap = new HashMap<>();


 if(results.getMappedResults() != null && results.getMappedResults().size() != 0){


          for(Map map:results.getMappedResults()){


                       classMaxScoreMap.put(map.get("_id").toString(), Double.valueOf(map.get("score").toString()));


          }


 }


return classMaxScoreMap;


欢迎加入我们的交流群425783133

MongoDB的`Aggregation Pipeline`允许你在查询数据时应用一系列处理步骤,其中一种操作可以用于分组并限制返回的结果数目。如果你想每10条记录分一,并且从每一中获一条作为代表,你可以使用`group`阶段配合`skip`和`limit`操作。 首先,你需要将文档按照某个字段进行分组,假设我们按照`_id`或者其他唯一标识符进行分组。这通常用`_id`表示,因为它自动生成并且对于每个唯一的输入文档都是唯一的。分组的命令看起来像这样: ```javascript { $group: { _id: "$_id", // 使用这里需要分组的关键字段 sample: { $first: "$$ROOT" } // 选每组的第一条记录 } } ``` 然后,你可以添加`skip`和`limit`步骤来跳过9条并仅保留第10条,但这只会在整个结果集中有效,不是按分段的。如果想得到每10条一的数据,你需要在应用分组后再次进行查询,每次增加`skip`的数量直到达到所需的总记录数。例如,如果你有总共有N条数据,可以这样操作: ```javascript let skipAmount = 0; while (skipAmount < N) { let pipeline = [ { $match: {} // 过滤不需要的部分(这里可以为空,因为我们已经分好) }, { $group: { _id: "$_id", sample: { $first: "$$ROOT" } } }, { $skip: skipAmount * 10 }, { $limit: 1 } ]; // 使用MongoTemplate执行pipeline List<Document> result = mongoTemplate.aggregate(pipeline, "yourCollectionName", Document.class); // 处理result... skipAmount += 10; // 移动到下一个10条 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值