Spring 分组然后排序

Spring 分组然后排序,spring,mongodb,sorting,grouping,Spring,Mongodb,Sorting,Grouping,我准备聚合到组,但不幸的是,我不能根据日期对输出进行排序。这里是聚合 Aggregation aggregation = newAggregation( match(Criteria.where(CREATED_CRITERIA).gte(midnight).lte(now)), unwind(list), group(list + ".label").sum(list + ".value").as("value"),

我准备聚合到组,但不幸的是,我不能根据日期对输出进行排序。这里是聚合

Aggregation aggregation = newAggregation(
            match(Criteria.where(CREATED_CRITERIA).gte(midnight).lte(now)),
            unwind(list),
            group(list + ".label").sum(list + ".value").as("value"),
             sort(Sort.Direction.ASC, "_id") 
            );
对象看起来像

{
    "_id" : ObjectId("56d9549e6a082cbc68dcedeb"),
    "created" : ISODate("2016-03-04T09:01:00.000Z"),
    "trucker" : NumberLong(0),
    "toProcess" : NumberLong(0),
    "smsSent" : NumberLong(0),
    "correct" : NumberLong(0),
    "redirected" : NumberLong(0),
    "truckerPerHours" : [ 
        {
            "label" : "Fri Mar 04 10:00:00 CET 2016",
            "value" : 0
        }
    ],
    "toProcessPerHours" : [ 
        {
            "label" : "Fri Mar 04 10:00:00 CET 2016",
            "value" : 0
        }
    ],
    "smsSentPerHours" : [ 
        {
            "label" : "Fri Mar 04 10:00:00 CET 2016",
            "value" : 0
        }
    ],
    "correctPerHours" : [ 
        {
            "label" : "Fri Mar 04 10:00:00 CET 2016",
            "value" : 0
        }
    ],
    "redirectedPerHours" : [ 
        {
            "label" : "Fri Mar 04 10:00:00 CET 2016",
            "value" : 0
        }
    ],
    "truckerPerBranch" : [],
    "toProcessPerBranch" : [],
    "smsSentPerBranch" : [],
    "correctPerBranch" : [],
    "redirectedPerBranch" : []
}
我想分组,然后根据“创建”日期排序,目前我根据标签排序,这不是一个好主意,因为它是一个字符串。

为什么不使用投影。。。试试这个:

如果您想返回带有agregation函数的实体列表,可以使用投影。在标准中,这是通过投影列表和投影完成的。e、 g

    final ProjectionList props = Projections.projectionList();
    //your group by conditions here:
    props.add(Projections.groupProperty("group property 1"));
    props.add(Projections.groupProperty("group property 2"));
    //your criteria with group by conditions here:
    crit.setProjection(props);
    crit.add(Order.desc("created"));

您可以使用操作符将日期字段包含在管道阶段中,然后可以在该字段上对结果管道进行排序。以下两个示例显示了这种方法:


Mongo Shell:

pipeline = [
    { 
        "$match": {
            "created": { "$lte": now, "$gte": midnight }
        }
    },
    { "$unwind": "$smsSentPerHours" },
    {
        "$group": {
            "_id": "$smsSentPerHours.label",
            "value": { "$sum": "$smsSentPerHours.value" },
            "created": { "$first": "$created" }
        }
    },
    { "$sort": { "created": 1 } }
]

db.collection.aggregate(pipeline);
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;

MongoTemplate mongoTemplate = repository.getMongoTemplate();
Aggregation agg = newAggregation(
    match(Criteria.where(CREATED_CRITERIA).gte(midnight).lte(now)),
    unwind(list),
    group(list + ".label")
        .sum(list + ".value").as("value")
        .first("created").as("created"),
    project("created").and("value").previousOperation(),
    sort(ASC, "created")
);

AggregationResults<OutputType> result = mongoTemplate.aggregate(agg,
                                            "collection", OutputType.class);
List<OutputType> mappedResult = result.getMappedResults();

Spring数据MongoDB:

pipeline = [
    { 
        "$match": {
            "created": { "$lte": now, "$gte": midnight }
        }
    },
    { "$unwind": "$smsSentPerHours" },
    {
        "$group": {
            "_id": "$smsSentPerHours.label",
            "value": { "$sum": "$smsSentPerHours.value" },
            "created": { "$first": "$created" }
        }
    },
    { "$sort": { "created": 1 } }
]

db.collection.aggregate(pipeline);
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;

MongoTemplate mongoTemplate = repository.getMongoTemplate();
Aggregation agg = newAggregation(
    match(Criteria.where(CREATED_CRITERIA).gte(midnight).lte(now)),
    unwind(list),
    group(list + ".label")
        .sum(list + ".value").as("value")
        .first("created").as("created"),
    project("created").and("value").previousOperation(),
    sort(ASC, "created")
);

AggregationResults<OutputType> result = mongoTemplate.aggregate(agg,
                                            "collection", OutputType.class);
List<OutputType> mappedResult = result.getMappedResults();
import static org.springframework.data.mongodb.core.aggregation.aggregation.*;
MongoTemplate MongoTemplate=repository.getMongoTemplate();
聚合agg=newAggregation(
匹配(标准.where(创建的标准).gte(午夜).lte(现在)),
展开(列表),
组(列表+“.label”)
.sum(列表+“.value”).as(“value”)
.首先(“创建”)。作为(“创建”),
项目(“已创建”)和(“值”).previousOperation(),
排序(ASC,“已创建”)
);
AggregationResults=mongoTemplate.aggregate(agg,
“collection”,OutputType.class);
List mappedResult=result.getMappedResults();