Java Spring数据聚合查询

Java Spring数据聚合查询,java,spring,mongodb,mongodb-query,aggregation-framework,Java,Spring,Mongodb,Mongodb Query,Aggregation Framework,团队 我不熟悉mongodb的Spring数据。我正在尝试学习用于聚合查询的Spring数据代码。但大部分教程只显示了简单的示例。你能帮我为给定的复杂聚合示例构建spring数据代码吗 SCHEMA: { "s" : "CB", "c" : "REQ_RCV", "e" : "cta_sms_click", "st" : "i", "b" : "UB", "a" : "account-1", "u" : "b1_h1_d1_m1

团队

我不熟悉mongodb的Spring数据。我正在尝试学习用于聚合查询的Spring数据代码。但大部分教程只显示了简单的示例。你能帮我为给定的复杂聚合示例构建spring数据代码吗

SCHEMA:
{
    "s"  : "CB",
    "c"  : "REQ_RCV",
    "e"  : "cta_sms_click",
    "st" : "i",
    "b"  : "UB",
    "a"  : "account-1",
    "u"  : "b1_h1_d1_m1_user_2",
    "c#" : "b1_h1_d1_m1_cr-2",
    "@"  : ISODate("2016-10-01T06:03:00.000Z"),
    "@h" : "16100106",
    "@d" : "161001",
    "@m" : "1610"
}


QUERY:
db.COLLECTION_NAME.aggregate([                       
        {$match:{"st":"i","@":{$gte : new ISODate("2015-10-01T06:00:00Z"), $lte : new ISODate("2017-10-02T10:00:00Z")}, "c":"REQ_RCV"}}, 
        {$group:{_id:{"b":"$b", "HOURLY":"$@h"}, count:{$sum:1}}}, 
        {$project : {_id:0, "BUCKET":"$_id.b", "TIME":"$_id.HOURLY", count:1}},
        {$sort:{"BUCKET":1, "TIME":1}}                     
    ]);
复杂性:

  • $match有多个标准
  • $project必须访问组id下的内部字段
  • 结果无法映射到类,因为它会根据$project字段的更改而变化。最终我会的 我想把它映射到java.util.HashMap,这样我就可以放置任何字段 内$项目。可能吗

  • Veeram的初步答复供参考:



    因此,可能有一种更适合spring数据的方法来实现这一点,但我所做的是连接MongoTemplate并将其用于聚合查询。我的例子比你想做的简单得多,但也许它可以帮助你:

        @Service
         public class AClass implements CategoryStructureService {
    
                @Autowired
                private MongoTemplate mongoTemplate ;
    
        ......
        private int method(CategoryStructureKey csKey) {
    
                Aggregation agg = Aggregation.newAggregation(Aggregation.match(Criteria
                        .where("_id").is(csKey)), Aggregation.unwind("fields"),
                        Aggregation.project("fields").andExclude("_id"), Aggregation
                                .sort(Direction.DESC, "fields.index"), Aggregation
                                .limit(1));
    
    AggregationResults<MultiValuedFieldContainer> field = mongoTemplate
                    .aggregate(agg, CategoryStructure.class,
                            MultiValuedFieldContainer.class);
            ....
    
            }
    
    @服务
    公共类AClass实现CategoryStructureService{
    @自动连线
    私有MongoTemplate MongoTemplate;
    ......
    私有int方法(CategoryStructureKey csKey){
    Aggregation agg=Aggregation.newAggregation(Aggregation.match(条件
    。其中(“_id”)是(csKey)),聚合。展开(“字段”),
    聚合。项目(“字段”)。并排除(“id”),聚合
    .sort(Direction.DESC,“fields.index”),聚合
    .限制(1));
    AggregationResults字段=mongoTemplate
    .骨料(骨料、类别结构、等级、,
    多值FieldContainer.class);
    ....
    }
    
    我是在一个旧的spring boot项目中这样做的,它是一个依赖项

    <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-mongodb</artifactId>
                <version>1.4.2.RELEASE</version>
            </dependency>
    
    
    org.springframework.data
    

    还有其他一些例子


    希望这有帮助

    您可以尝试以下方法。替换为日期值和集合名称

    import static org.springframework.data.domain.Sort.Direction.ASC;
    import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
    import static org.springframework.data.mongodb.core.query.Criteria.where;
    
    Aggregation agg = newAggregation(match(where("st").is("i").and("@").gte(new Date()).lte(new Date()).and("c").is("REQ_RCV")),
                group(fields("b").and("HOURLY", "$@h")).count().as("count"),
                sort(ASC, Aggregation.previousOperation()));
    
    List<BasicDBObject> dbObjects = mongoOperations.aggregate(agg, "collection_name", BasicDBObject.class).getMappedResults();
    
    导入静态org.springframework.data.domain.Sort.Direction.ASC;
    导入静态org.springframework.data.mongodb.core.aggregation.aggregation.*;
    导入静态org.springframework.data.mongodb.core.query.Criteria.where;
    聚合agg=newAggregation(匹配(其中(“st”)为(“i”)、gte(新日期())、lte(新日期())和(“c”)为(“REQ_RCV”),
    组(字段(“b”)和(“小时”,“美元小时”)).count().as(“count”),
    排序(ASC,Aggregation.previousOperation());
    List dbObjects=mongoOperations.aggregate(agg,“collection_name”,BasicDBObject.class).getMappedResults();
    
    @chridam你能在这里帮我吗?一个问题。在
    项目中声明名称,如“BUCKET”和“TIME”是在
    排序中调用它的强制性要求。这是不可能写入
    排序(ASC,“$\u id.b”,“$\u id.HOURLY”)
    的吗?更新了答案。对不起,我应该已经发现了。你可以使用
    以前的操作()
    用于保存对先前组的引用的排序
    \u id
    谢谢!但我将保留您的两个答案:)
    import static org.springframework.data.domain.Sort.Direction.ASC;
    import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
    import static org.springframework.data.mongodb.core.query.Criteria.where;
    
    Aggregation agg = newAggregation(match(where("st").is("i").and("@").gte(new Date()).lte(new Date()).and("c").is("REQ_RCV")),
                group(fields("b").and("HOURLY", "$@h")).count().as("count"),
                sort(ASC, Aggregation.previousOperation()));
    
    List<BasicDBObject> dbObjects = mongoOperations.aggregate(agg, "collection_name", BasicDBObject.class).getMappedResults();