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

MongoDB Java聚合中使用sum()指定字面量而非引用的方法

问题

当前使用Java语句Aggregation.group("name").sum("1").as("count")生成的MongoDB聚合语句为:

{"$group" : { "_id": "$name", "count": { "$sum": "$1" } } }

希望将$sum的参数改为字面量(去掉$符号),即实现{ "$sum": "1" }的效果,请问该如何操作?

解决方案

在Spring Data MongoDB中,直接调用sum("1")会被解析为对字段1的引用(自动添加$前缀)。要生成引用字面量的$sum操作,可使用以下两种方式:

方式一:用SumOperators构建字面量求和

借助Spring Data的SumOperators.Sum静态方法,直接传入字面量值:

import org.springframework.data.mongodb.core.aggregation.SumOperators;
import org.springframework.data.mongodb.core.aggregation.Aggregation;

// 构建聚合操作
Aggregation aggregation = Aggregation.newAggregation(
    Aggregation.group("name")
        .addField("count")
        .withValue(SumOperators.Sum.of(1))
);

这段代码会生成目标聚合语句:

{"$group" : { "_id": "$name", "count": { "$sum": 1 } } }

如果需要字符串字面量"1",只需把代码中的1替换为"1"即可。

方式二:自定义AggregationOperation构造Document

如果需要更灵活的控制,可直接构造MongoDB的Document对象定义聚合阶段:

import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.bson.Document;

// 自定义group阶段的聚合操作
AggregationOperation groupStage = context -> new Document("$group",
    new Document("_id", "$name")
        .append("count", new Document("$sum", 1))
);

// 构建聚合
Aggregation aggregation = Aggregation.newAggregation(groupStage);

这种方式完全手动控制聚合语句结构,同样能生成包含字面量的$sum操作。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:07:06