下面是具有数组名称数据的文档,我想根据 StatusCode 过滤记录,按年份分组并对不同类型的最近记录中的金额值求和。
{
"_id" : ObjectId("5fce46ca6ac9808276dfeb8c"),
"year" : 2018,
"datum" : [
{
"StatusCode" : "A",
"Type" : "1",
"Amount" : NumberDecimal("100"),
"Date" : ISODate("2018-05-30T00:46:12.784Z")
},
{
"StatusCode" : "A",
"Type" : "1",
"Amount" : NumberDecimal("300"),
"Date" : ISODate("2023-05-30T00:46:12.784Z")
},
{
"StatusCode" : "A",
"Type" : "2",
"Amount" : NumberDecimal("420"),
"Date" : ISODate("2032-05-30T00:46:12.784Z")
},
{
"StatusCode" : "B",
"Type" : "2",
"Amount" : NumberDecimal("420"),
"Date" : ISODate("2032-05-30T00:46:12.784Z")
}
]
}
就我而言,以下是预期结果:
{
Total : 720
}
我想通过以下聚合查询模式实现结果
db.collection.aggregate([
{
$addFields: {
datum: {
$reduce: {
input: "$datum",
initialValue: {},
"in": {
$cond: [
{
$and: [
{ $in: ["$$this.StatusCode", ["A"]] }
]
},
"$$this",
"$$value"
]
}
}
}
}
},
{
$group: {
_id: "$year",
RecentValue: { $sum: "$datum.Amount" }
}
}
])
您可以首先 $unwind
datum
数组。进行过滤并按日期排序。然后通过 $group 获取最新数据的记录。最后再做一个 $group 来计算总和。
db.collection.aggregate([
{
"$unwind": {
path: "$datum",
preserveNullAndEmptyArrays: true
}
},
{
$match: {
"datum.StatusCode": {
$in: [
"A"
]
}
}
},
{
$sort: {
_id: 1,
year: 1,
"datum.Type": 1,
"datum.Date": 1
}
},
{
$group: {
_id: {
_id: "$_id",
year: "$year",
type: "$datum.Type"
},
datum: {
"$last": "$datum"
}
}
},
{
"$group": {
"_id": {
_id: "$_id._id",
year: "$_id.year"
},
total: {
$sum: "$datum.Amount"
}
}
}
])
这里有一个mongo Playground供大家参考。