如何检索 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")。使用findaggregate 命令有没有更优雅的方法?

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:
    $sort - 按year 降序排序。 $group - 按 stockyear 分组。 $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 上每个其他不同字段的字段最大的文档?的主要内容,如果未能解决你的问题,请参考以下文章

如何将每个数组字段与MongoDB中的其他字段匹配

如何使用 Autopopulate Mongoose Mongodb 选择要检索的字段?

如何使用聚合 MongoDB 查找具有两列的不同字段

mongodb count 每个字段/键的不同值的数量

如何在Spring中为字段返回不同的值

MongoDB索引