如何获取分组结果的最新值?

问题描述 投票:0回答:1

下面是具有数组名称数据的文档,我想根据 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" }
        }
      }
    ])
mongodb mongodb-query aggregation-framework
1个回答
0
投票

您可以首先 $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供大家参考。

© www.soinside.com 2019 - 2024. All rights reserved.