如何在spring数据mongo db中使用$ month使用$ month

时间:2016-02-10 10:30:11

标签: java mongodb spring-mvc spring-data-mongodb

我正在使用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中编写此查询。我是使用聚合的新手。这是他们使用它的简单方法。请帮忙

谢谢。

2 个答案:

答案 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")
);