Java Spring数据聚合查询
团队 我不熟悉mongodb的Spring数据。我正在尝试学习用于聚合查询的Spring数据代码。但大部分教程只显示了简单的示例。你能帮我为给定的复杂聚合示例构建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
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}}
]);
复杂性:
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();