java – 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目前不支持

>具有自定义键名的复合聚合_id,当然您可以接受defualt字段名称转换
>使用$cond操作或$sum中的任何表达式,因为它仅支持映射字段.

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

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

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阶段构建管道.

相关文章

MongoTemplate 是Spring Data MongoDB 中的一个核心类,为 S...
笔者今天要分享的是一个项目重构过程中如何将数据库选型由原...
mongodb/mongoTemplate.upsert批量插入更新数据的实现
进入官网下载官网安装点击next勾选同意,点击next点击custom...
头歌 MongoDB实验——数据库基本操作
期末考试复习总结