首页 > 解决方案 > 如何在MongoDB中获取每个月的最后一个值?

问题描述

我的数据库中有三个字段id,dateqty。我想按 对它们进行分组id并找到qty每个月的最新数量。因此,对于每个月,每个月date的最后一天,qty都会为其返回 。

如果输入是

[
  {
    "id": "ABC",
    "date": "2020-10-02 15:03:00.00",
    "qty": 500,
  },
  {
    "id": "ABC",
    "date": "2020-10-31 20:22:00.00",
    "qty": 100,
  },
  {
    "id": "ABC",
    "date": "2020-11-03 04:22:00.00",
    "qty": 200,
  },
  {
    "id": "ABC",
    "date": "2020-11-18 04:22:00.00",
    "qty": 50,
  },
  {
    "id": "ABC1",
    "date": "2020-11-05 04:22:00.00",
    "qty": 5000,
  },
  {
    "id": "ABC1",
    "date": "2020-11-15 04:22:00.00",
    "qty": 4580,
  },
]

那么输出应该是

[
  {
    "id": "ABC",
    "qtys": [
      {
        "date": "2020-10-31 20:22:00.00",
        "qty": 100
      },
      {
        "date": "2020-11-18 04:22:00.00",
        "qty": 50
      }
    ]
  },
  {
    "id": "ABC1",
    "qtys": [
      {
        "date": "2020-11-15 04:22:00.00",
        "qty": 4580
      }
    ]
  },
]

标签: mongodbaggregation-framework

解决方案


  • $addFieldsdate字段从字符串类型转换为日期类型,如果它已经是日期类型,则忽略此阶段
  • $sortdate降序排列
  • $groupby id, monthandyeardate字段中提取后使用$yearand$month获取第一个文档
  • $group仅由id并构造数量数组qtys
db.collection.aggregate([
  { $addFields: { date: { $toDate: "$date" } } },
  { $sort: { date: -1 } },
  {
    $group: {
      _id: {
        id: "$id",
        month: { $month: "$date" },
        year: { $year: "$date" }
      },
      qtys: { $first: { date: "$date", qty: "$qty" } }
    }
  },
  {
    $group: {
      _id: "$_id.id",
      qtys: { $push: "$qtys" }
    }
  }
])

操场


推荐阅读