我正在使用mongodb。我必须在我的spring数据mongo db中使用$ date的聚合查询。这是我的用户收藏。
{
"_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中编写此查询。我是使用聚合的新手。这是他们使用它的简单方法。请帮忙
谢谢。
答案 0 :(得分:2)
您可以先尝试使用投影操作中的 SpEL andExpression
投影字段,然后按组操作中的新字段进行分组:
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()
),名称为{{ 1}}。
第四步,通过排序操作按升序排序,将分组"month_joined"
文档的结果列表按其出现次数排序。
最后调用MongoTemplate上的 month_joined
方法,让MongoDB以创建的Aggregation作为参数执行实际的聚合操作。
要过滤当前年份的管道中的文档,您需要投影一个新字段,该字段包含日期的年份部分,然后在项目步骤之后发出匹配运算符,例如
aggregate()
答案 1 :(得分:0)
从2.1开始,您可以使用DateOperators.Month。
Aggregation agg = newAggregation(
project("id").and(DateOperators.Month.month("createdDate")).as("month_joined"),
group("month_joined").count().as("number"),
project("number").and("month_joined").previousOperation(),
sort(ASC, "number")
);