You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:24:07