如何检索 MongoDB 上每个其他不同字段的字段最大的文档?
Posted
技术标签:
【中文标题】如何检索 MongoDB 上每个其他不同字段的字段最大的文档?【英文标题】:How to retrieve documents where a field is maximum for every other distinct field on MongoDB? 【发布时间】:2022-01-07 21:52:53 【问题描述】:我在 MongoDB 上有以下集合(为了清楚起见,我省略了字段 _id
):
[
"stock": "Stock1",
"value": 12,
"month": 1,
"year": 2019
,
"stock": "Stock1",
"value": 13,
"month": 2,
"year": 2019
,
"stock": "Stock1",
"value": 14,
"month": 1,
"year": 2020
,
"stock": "Stock1",
"value": 15,
"month": 2,
"year": 2020
,
"stock": "Stock2",
"value": 6,
"month": 1,
"year": 2019
,
"stock": "Stock2",
"value": 5,
"month": 2,
"year": 2019
]
并且我希望检索每个stock
的文档,其中包含最新的(最大)year
可用,因此我最终得到以下结果:
[
"stock": "Stock1",
"value": 14,
"month": 1,
"year": 2020
,
"stock": "Stock1",
"value": 15,
"month": 2,
"year": 2020
,
"stock": "Stock2",
"value": 6,
"month": 1,
"year": 2019
,
"stock": "Stock2",
"value": 5,
"month": 2,
"year": 2019
]
我很想以编程方式循环遍历每个stock
,并在第一步用find("stock": "Stockx").sort("year": -1).limit(1)
查询最后一个year
,然后在第二步查询find("stock": "Stockx", "year": maxyearforStockx")
。使用find
或aggregate
命令有没有更优雅的方法?
任何帮助将不胜感激!
【问题讨论】:
【参考方案1】:$sort
- 按year
降序排序。
$group
- 按 stock
和 year
分组。
$group
- 按stock
分组并取stockYearItems
的第一项(来自2)。
$unwind
- 将 items.stockYearItems
数组解构为多个文档。
$replaceRoot
- 将输入文档替换为新文档以显示 stock
文档。
db.collection.aggregate(
"$sort":
"year": -1
,
$group:
_id:
"stock": "$stock",
"year": "$year"
,
stockYearItems:
$push: "$$ROOT"
,
$group:
_id: "$_id.stock",
items:
$first: "$$ROOT"
,
$unwind: "$items.stockYearItems"
,
"$replaceRoot":
"newRoot": "$items.stockYearItems"
)
Sample Mongo Playground
【讨论】:
以上是关于如何检索 MongoDB 上每个其他不同字段的字段最大的文档?的主要内容,如果未能解决你的问题,请参考以下文章