【问题标题】:How to get the recent values of grouped result?如何获取分组结果的最新值?
【发布时间】:2020-12-09 09:37:49
【问题描述】:

以下是具有数组名称 datum 的文档,我想根据 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】:

    您可以先 $unwind datum 数组。进行过滤并按日期排序。然后通过 $group 获取最新数据的记录。最后再做一个 $group 来计算总和。

    这是一个mongo playground 供您参考。

    【讨论】:

    • 如何在不展开的情况下实现结果,我们不能在reduce函数中做吗?
    • 首选$reduce有什么特殊原因..?
    • 是的,想避免展开,它应该处理超过 100 万条记录。
    猜你喜欢
    • 1970-01-01
    • 2015-01-08
    • 2022-12-17
    • 2018-08-03
    • 1970-01-01
    • 2022-07-05
    • 2018-03-17
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多