如何在使用 MongoTemplate 进行分组期间对 mongodb 内部字段求和并推送它

Posted

技术标签:

【中文标题】如何在使用 MongoTemplate 进行分组期间对 mongodb 内部字段求和并推送它【英文标题】:How to sum a mongodb inner field and push it during grouping using MongoTemplate 【发布时间】:2021-03-14 10:06:46 【问题描述】:

我可以在 MongoDB 控制台的推送操作中使用 sum。但是,我不知道如何使用 MongoTemplate 做同样的事情?

$group : 
     _id: "$some_id",
     my_field:  $push : $sum: "$my_field" 
 

我使用的代码是这样的:

Aggregation aggregation =
    Aggregation.newAggregation(
        match(matchingCriteria),
        group("some_id")
            .count()
            .as("count")
            .push("my_field")
            .as("my_field")
        project("some_id", "count", "my_field"));
AggregationResults<MyModel> result =
    mongoTemplate.aggregate(aggregation, "my_collection", MyModel.class);

问题是我想要 my_field 的总和,但它在此处以 my_field 数组的形式出现(因为我直接使用推送)。我可以在推送操作中使用上述总和来实现相同的目的。但无法将其用于 MongoTemplate。我的应用程序在 Spring Boot 中。我也查看了这些方法的文档,但找不到太多。

另外,我也尝试在字段上直接使用 .sum() (不使用推送),但这对我不起作用,因为 my_field 是一个内部对象,它不是数字,而是后面的数字数组分组。这就是为什么我需要使用 push 和 sum 组合。

对此的任何帮助表示赞赏。提前致谢。

【问题讨论】:

【参考方案1】:

我能够使用以下代码使其工作:

Aggregation aggregation =
    Aggregation.newAggregation(
        match(allTestMatchingCriteria),
        project("some_id")
            .and(AccumulatorOperators.Sum.sumOf("my_field"))
            .as("my_field_sum")
        group("some_id")
            .count()
            .as("count")
            .push("my_field_sum")
            .as("my_field_sum"),
        project("some_id", "count", "my_field_sum"));
AggregationResults<MyModel> result =
    mongoTemplate.aggregate(aggregation, "my_collection", MyModel.class);

我在投影阶段本身使用了AccumulatorOperators.Sum,并对内部字段求和并获得所需的输出。然后我将它传递到分组阶段,在那里我进行计数聚合,因为我也需要这些数据,然后必须投影生成的所有数据以作为输出收集。

【讨论】:

以上是关于如何在使用 MongoTemplate 进行分组期间对 mongodb 内部字段求和并推送它的主要内容,如果未能解决你的问题,请参考以下文章

MongoTemplate 使用aggregate聚合查询

使用 mongoTemplate 进行分页

使用 Spring Boot 和 MongoTemplate 对 MongoDB 结果进行排序

MongoDB中计算的分组字段

如何根据条件对sql中的行进行分组

使用 mongoTemplate 在 spring-data-mongo Java 中进行 Mongo 聚合查询