java - Spring Data MongoDB - 聚合方法

标签 java mongodb aggregation-framework spring-data-mongodb

有谁知道如何使用 Spring-data 将以下聚合函数转换为 java 代码?

db.myCollection.aggregate([
    {$match:{"status" : {$in:["WORKING","UNASSIGNED"]}}},
    {$group:{
            _id:{
                "status":"$status",
                "queue":"$queueName"
             },
             "count":{$sum:1},
             "oldest":{$min:"$queueTime"},
             "slow":{$sum:{$cond:[
                                {$lte: ["$queueServiceTs", new Date()]},
                                        1,
                                        0]}
                          }

        }
    }
]);

最佳答案

Spring mongo 当前不支持:

  1. 具有自定义键名称的复合聚合 _id,当然您可以只接受默认的字段名称翻译

  2. 使用 $cond $sum 中的操作或任何表达式,因为它仅支持映射字段。

因此,在这种情况下,第二个问题会破坏聚合辅助函数的使用。您可以通过先执行 $project 来解决这个问题,但这需要额外的执行阶段,这会影响性能。

但是您可以做的是创建自己的抽象类,它在标准构建器函数中工作,但允许您使用标准对象构建管道阶段:

public class CustomGroupOperation implements AggregationOperation {
    private DBObject operation;

    public CustomGroupOperation (DBObject operation) {
        this.operation = operation;
    }

    @Override
    public DBObject toDBObject(AggregationOperationContext context) {
        return context.getMappedObject(operation);
    }
}

然后您可以将它与标准构建器一起使用,如下所示:

    Aggregation aggregation = newAggregation(
            new CustomGroupOperation(
                    new BasicDBObject("$group",
                        new BasicDBObject("_id",
                            new BasicDBObject("status","$status")
                                .append("queue","$queueName")
                        )
                        .append("count",new BasicDBObject("$sum",1))
                        .append("oldest", new BasicDBObject("$min","$queueTime"))
                        .append("slow",
                            new BasicDBObject("$sum",
                                new BasicDBObject("$cond",Arrays.asList(
                                    new BasicDBObject("$lte",Arrays.asList(
                                        "$queueServiceTs",
                                        new Date()
                                    )),
                                    1,
                                    0
                                ))
                            )
                        )
                    )
            )
    );

然后用 $group 构建了一个管道完全按照您定义的阶段。

关于java - Spring Data MongoDB - 聚合方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32664584/

相关文章:

java - 即使捕获到异常,执行也会终止

java - 如何从 Resultset 构造数组数组

java - 是否可以动态设置 SpringBootTest 属性?

node.js - 带有子文档的 Mongoose 模式字段名称和类型

linux - 如何将linux命令日志捕获到文件中?

mongodb - 在一个 MongoDB 聚合查询中进行排序和分组

javascript - 按日期与MongoDB中的本地时区分组

java - spring-boot-starter-data-jpa 依赖错误

MySQL 密码 () 列 : migration to MongoDB

java - 带条件的 mongotemplate 聚合