如何使用spring数据mongodb根据月份对日期进行分组,并获得每个月的最新值?

a6b3iqyw  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(519)

以下是我的json结构的一部分:

{
       "dateOfCalculation" : ISODate("2018-08-13T06:02:48.587Z"),
       "value" : 6.0
   },
   {
       "dateOfCalculation" : ISODate("2018-08-13T06:04:38.294Z"),
       "value" : 8.0
   },
   {
       "dateOfCalculation" : ISODate("2018-08-30T07:21:08.444Z"),
       "value" : 5.0
   },    
   {
       "dateOfCalculation" : ISODate("2018-10-01T10:04:33.564Z"),
       "value" : 5.58333349227905
   },
   {
       "dateOfCalculation" : ISODate("2018-10-24T11:41:24.188Z"),
       "value" : 5.16666650772095
   },
   {
       "dateOfCalculation" : ISODate("2018-10-26T14:03:54.672Z"),
       "value" : 5.58333349227905
   },    
   {
       "dateOfCalculation" : ISODate("2019-01-10T15:05:44.842Z"),
       "value" : 3.5
   },
   {
       "dateOfCalculation" : ISODate("2019-01-21T10:08:52.429Z"),
       "value" : 6.0
   },
   {
       "dateOfCalculation" : ISODate("2019-01-21T10:38:57.468Z"),
       "value" : 5.16666650772095
   },
   {
       "dateOfCalculation" : ISODate("2019-01-25T14:01:56.779Z"),
       "value" : 6.0
   }

使用spring数据mongodb,我想根据月份对这些数据进行分组,并获取最新日期记录的值。大致如下:第8个月-

{
        "dateOfCalculation" : ISODate("2018-08-30T07:21:08.444Z"),
        "value" : 5.0
    },

第一个月-

{
       "dateOfCalculation" : ISODate("2019-01-25T14:01:56.779Z"),
       "value" : 6.0
   }

我应该在springdatamongodb中使用什么样的聚合操作,这样我就可以首先根据月份对它们进行分组,然后获取当月的最新数据?

5sxhfpxr

5sxhfpxr1#

mongodb查询如下所示:

db.yourCollection.aggregate([
    {$addFields: {month: {$month :"$dateOfCalculation"}}},
    {$group:{_id: {month:"$month"},documents:{$push:"$$ROOT"}}},
    {$project:{lastestDate: {$arrayElemAt:["$documents", {$indexOfArray:["$documents",{$max:"$documents.dateOfCalculation"}]}]}}}
])

此聚合将返回具有以下架构的文档:

{
    "_id" : {
        "month" : 1
    },
    "lastestDate" : {
        "_id" : ObjectId("5c59c05fb6f5b50bd40235a1"),
        "dateOfCalculation" : ISODate("2019-01-25T15:01:56.779+01:00"),
        "value" : 6,
        "month" : 1
    }
}

下面是一个使用spring数据mongodb的例子。

ProjectionOperation projectionOperation1 = project("dateOfCalculation","value").andExpression("month(dateOfCalculation)").as("month");
GroupOperation groupOperation = group("month").push("$$ROOT").as("documents");
ProjectionOperation projectionOperation2 = project().and(ArrayOperators.ArrayElemAt.arrayOf("documents")
        .elementAt(ArrayOperators.IndexOfArray.arrayOf("documents")
                .indexOf(AccumulatorOperators.Max.maxOf("documents.dateOfAccumulation")))).as("latestDate");
 List<yourEntityObject> result = mongoTemplate.aggregate(Aggregation.newAggregation(projectionOperation1,groupOperation,projectionOperation2)
        , "yourCollection", yourEntityObject.class).getMappedResults();

蒙德银行 $addFileds 操作符没有在springmongodb中实现,所以您必须使用 ProjectionOperation . 关于 $month 运算符您可以使用spel andexpression()或dateoperators.month。

相关问题