gpt4 book ai didi

java - 如何在 spring data mongodb 中使用聚合来使用 $month

转载 作者:可可西里 更新时间:2023-11-01 09:13:32 29 4
gpt4 key购买 nike

我正在使用 mongodb。我必须在我的 spring data mongo db 中使用 $date 的聚合查询。这是我的用户 Collection 。

{
"_id" : NumberLong(70289),
"_class" : "com.samepinch.domain.user.User",
"age" : 25,
"roles" : [
"ROLE_MODERATOR",
"ROLE_USER"
],
"firstName" : "Abhi",
"lastName" : "Saini",
"email" : "abhisheksn138@gmail.com",
"createdDate" : ISODate("2015-12-04T12:29:57.604Z"),
"updatedDate" : ISODate("2016-02-10T06:23:13.314Z")
}

这是我的 mongodb 查询

 db.users.aggregate([{ $project : { month_joined : { $month : "$createdDate" } } } ,{ $group : { _id : {month_joined:"$month_joined"} , number : { $sum : 1 } } },{ $sort : { "_id.month_joined" : 1 } }])

查询给了我想要的结果:

{ "_id" : { "month_joined" : 1 }, "number" : 19 }
{ "_id" : { "month_joined" : 2 }, "number" : 7 }
{ "_id" : { "month_joined" : 9 }, "number" : 16 }
{ "_id" : { "month_joined" : 10 }, "number" : 12 }
{ "_id" : { "month_joined" : 11 }, "number" : 11 }
{ "_id" : { "month_joined" : 12 }, "number" : 13 }

现在我必须使用 mongotemplate 在 spring data mongodb 中编写此查询。我是使用聚合的新手。他们是否有任何简单的使用方法。请帮忙

谢谢。

最佳答案

您可以先尝试使用 SpEL andExpression 投影字段在projection操作中,然后在group操作中按新字段进行分组:

Aggregation agg = newAggregation(
project("id").andExpression("month(createdDate)").as("month_joined"),
group("month_joined").count().as("number"),
project("number").and("month_joined").previousOperation(),
sort(ASC, "number")
);

AggregationResults<JoinCount> results = mongoTemplate.aggregate(agg,
"collectionName", JoinCount.class);
List<JoinCount> joinCount = results.getMappedResults();

在上面,通过 newAggregation 静态工厂方法创建了一个新的聚合,您将聚合操作列表传递给该方法。这些聚合操作定义了聚合的聚合管道。

在第一步中,您使用 SpEL andExpression 投影输入集合中的字段配合项目运作。

在第二步中,您使用组操作为每个 “month_joined” 值定义一个组,您通过 count() 聚合为其聚合出现次数运算符并将结果收集到名为 "number" 的新字段中。

作为第三步,选择字段 “number” 并为 _id 字段创建一个别名 - 从上一个组操作生成(因此调用 previousOperation()),名称为 "month_joined"

作为第四步,通过排序操作按出现次数升序对分组的 month_joined 文档的结果列表进行排序。

最后调用 MongoTemplate 上的 aggregate() 方法,让 MongoDB 以创建的聚合作为参数执行实际的聚合操作。


要过滤当前年份进入管道的文档,您需要投影一个包含日期的年份部分的新字段,然后在项目步骤之后发出匹配运算符,例如

Aggregation agg = newAggregation(
project("id")
.andExpression("month(createdDate)").as("month_joined")
.andExpression("year(createdDate)").as("year"),
match(Criteria.where("year").is(2016)),
group("month_joined").count().as("number"),
project("number").and("month_joined").previousOperation(),
sort(ASC, "number")
);

AggregationResults<JoinCount> results = mongoTemplate.aggregate(agg,
"collectionName", JoinCount.class);
List<JoinCount> joinCount = results.getMappedResults();

关于java - 如何在 spring data mongodb 中使用聚合来使用 $month,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35312677/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com