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();