当前位置: 首页 > 知识库问答 >
问题:

如何在spring data mongo db中使用聚合来使用$month

段干高歌
2023-03-14

我使用的是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")
}
 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中编写这个查询。我是使用聚合的新手。他们是任何简单的方法来使用它。请帮忙

谢谢你。

共有1个答案

欧阳智志
2023-03-14

您可以尝试先在投影操作中使用SpEL和dexpression投影字段,然后在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();

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

在第一步中,通过在项目操作中使用SpELandexpression来投影输入集合中的字段。

在第二步中,您使用group操作为每个“month_joined”值定义一个组,您通过count()聚合运算符聚合该值的发生计数,并在一个名为“number”的新字段中收集结果。

第三步,选择字段“number”并为前面的组操作(因此调用PreviousOperation())生成的_id字段创建一个别名,名称为“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();
 类似资料:
  • 我有一套文件。每个文档有两个字段—“代码”和“状态”。我的mongodb集合包含以下文档: 我想按每个代码的状态查找计数。我想要的输出如下所示: 如何使用spring data mongodb实现这一点?我对mongodb很陌生。 更新我已成功编写mongodb查询。这是: 有人能帮助您在spring data mongodb中编写此查询吗?

  • 我的数据在Kafka事务处理主题中是这样的: ConsumerRecord(Topic='transactions',partition=0,offset=4,timestamp=1591277946736,timestamp_type=0,key=none,value={'transaction_id':'4952940859','account_number':14,'transaction_

  • 我需要汇总以下记录中的所有标记: https://gist.github.com/sbassi/5642925 (这个片段中有2个样本记录)并按大小对它们进行排序(首先是出现频率更高的标记)。但是我不想考虑具有特定“user_id”的数据(比方说,2,3,6和12)。 以下是我的尝试(只是聚合,没有过滤和排序): db。用户库。聚合({$unwind:“$annotations.data.tags

  • 我想执行一个进行基本分页的聚合查询: 查找属于某个 以下是查询的详细信息: 这将查找所有匹配的文档: 这对文档进行了排序: 这会对文档进行计数,并传递未修改的文档,但我肯定这样做是错误的,因为事情从这里开始变得很奇怪: 这似乎跳过了一些文档: 这本应限制文件,但却没有: 这会返回计数,但不会返回数组中的文档,而是返回每个字段的数组: 结果是: 我哪里弄错了?

  • 我有mongodb聚合查询,它在shell中工作得很好。如何重写此查询以便与morphia一起使用? 只接受一个字段名,但我需要向该集合添加对象。