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
相关产品推荐
相关产品推荐

