下面是我的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-data-mongodb,我想根据月份对它们进行分组,并获取最新日期记录的值。如下所示: 第八个月-
{
"dateOfCalculation" : ISODate("2018-08-30T07:21:08.444Z"),
"value" : 5.0
},
第一个月-
{
"dateOfCalculation" : ISODate("2019-01-25T14:01:56.779Z"),
"value" : 6.0
}
我应该在Spring-data-mongodb中使用哪种聚合操作,以便可以先根据月份对它们进行分组,然后再获取该月的最新数据?
答案 0 :(得分:0)
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();
MongDB $addFileds
运算符未在Spring MongoDB中实现,因此您必须使用ProjectionOperation
进行同样的操作。关于$month
运算符,您可以使用 SpEL andExpression()或DateOperators.Month。