如何在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 } ]
步骤说明:
- $group阶段:按
billYear分组,同时计算每个分组内的billNumber最大值,得到每个年份对应的最大账单号数据。 - $sort阶段:将分组结果按年份降序排列,确保最大年份排在首位。
- $limit阶段:仅保留排序后的第一条数据,也就是目标结果。
- $project阶段:可选步骤,重命名字段并隐藏原
_id,让结果结构更清晰易读。
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

