Node.js Mongoose聚合查询转换为Spring Boot MongoTemplate实现咨询
使用MongoTemplate实现对应聚合查询的方案
以下实现和你提供的Mongoose逻辑完全对齐,可直接在Spring Boot项目中使用:
步骤1:定义聚合结果接收类(可选,也可直接用Document接收)
如果希望直接拿到结构化的结果,可以先定义一个DTO:
import java.math.BigDecimal; // 不用lombok的话手动写getter、setter即可 import lombok.Data; @Data public class PriceAmountGroup { // 对应聚合返回的_id,也就是价格字段 private BigDecimal price; // 对应分组求和后的总数量 private BigDecimal amount; }
步骤2:编写聚合查询逻辑
import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationResults; import org.springframework.data.mongodb.core.query.Criteria; import javax.annotation.Resource; import java.util.List; import static org.springframework.data.mongodb.core.aggregation.Aggregation.*; // 你的业务服务类 public class OrderService { @Resource private MongoTemplate mongoTemplate; public List<PriceAmountGroup> getBuyOrderGroupByPrice(String instrument) { // 按顺序构造四个聚合阶段,和原Mongoose逻辑一一对应 Aggregation aggregation = newAggregation( // 对应$match阶段:过滤符合条件的订单 match( Criteria.where("status").is("Open") .and("instrument").is(instrument) .and("bidType").is("buy") ), // 对应$group阶段:按价格分组,累加对应数量 group("price").sum("amount").as("amount"), // 对应$sort阶段:按价格倒序排列 sort(Sort.Direction.DESC, "_id"), // 对应$limit阶段:最多返回100条 limit(100) ); // 执行聚合查询 AggregationResults<PriceAmountGroup> result = mongoTemplate.aggregate( aggregation, "orders", // 这里填你订单集合的实际名称,也可以传入Orders实体类的Class对象自动读取集合名 PriceAmountGroup.class ); return result.getMappedResults(); } }
注意事项
- 如果不需要自定义DTO,可以把结果映射为
org.bson.Document类型,取值时直接调用document.get("_id")、document.get("amount")即可 - 如果你的amount字段是整数类型,把DTO里的amount字段类型改为Integer或者Long即可
- 要查询sell类型的订单,仅需要把match条件里的
bidType值改为sell即可复用该逻辑
内容的提问来源于stack exchange,提问作者Oya
相关产品推荐
相关产品推荐

