You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MongoDB中用单查询获取最大账单年对应最大账单号?

问题:获取最大账单年份及对应最大账单号

假设集合中有如下结构的文档:

{
  _id: ObjectId("63af57637d4f4258c1ba460b"),
  metadata: {
    billYear: 2022,
    billNumber: 1
  }
},
{
  _id: ObjectId("63af57637d4f4258c1ba460c"),
  metadata: {
    billYear: 2022,
    billNumber: 2
  }
},
{
  _id: ObjectId("63af57637d4f4258c1ba460d"),
  metadata: {
    billYear: 2023,
    billNumber: 1
  }
}

需求是获取billYear的最大值,以及该年份对应的billNumber的最大值。本例中结果应为最大年份2023,对应最大账单号1。

我曾尝试以下语句,但无法得到正确结果:

Data.aggregate( [ { $max : { billNumber : "$billYear" } } ] )

后来更新了语句,能单独获取最大年份:

Data.aggregate([{ $group: { _id: null, maxBillYear: { $max: "$metadata.billYear" }}} ])

执行结果:

[ { _id: null, maxBillYear: 2023 } ]

原本打算用这个年份再执行一次查询获取对应最大账单号,但能否通过单个查询直接完成此操作?


解决方案

可以通过MongoDB的聚合管道,用单个查询完成需求,具体语句如下:

Data.aggregate([
  // 按billYear分组,计算每个年份的最大billNumber
  {
    $group: {
      _id: "$metadata.billYear",
      maxBillNumber: { $max: "$metadata.billNumber" }
    }
  },
  // 按年份降序排序,最大年份排在最前面
  {
    $sort: { _id: -1 }
  },
  // 只取第一条数据,即最大年份及其对应最大账单号
  {
    $limit: 1
  },
  // 重命名字段,让结果更直观(可选)
  {
    $project: {
      _id: 0,
      maxBillYear: "$_id",
      maxBillNumber: 1
    }
  }
])

执行该查询后,会得到如下结果:

[ { maxBillYear: 2023, maxBillNumber: 1 } ]

步骤说明:

  1. $group阶段:按billYear分组,同时计算每个分组内的billNumber最大值,得到每个年份对应的最大账单号数据。
  2. $sort阶段:将分组结果按年份降序排列,确保最大年份排在首位。
  3. $limit阶段:仅保留排序后的第一条数据,也就是目标结果。
  4. $project阶段:可选步骤,重命名字段并隐藏原_id,让结果结构更清晰易读。

内容的提问来源于stack exchange,提问作者user3142695

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:11:28