mongodb - 如何检索 MongoDB 上每个其他不同字段的字段最大的文档?

标签 mongodb mongodb-query nosql aggregation-framework document

我在 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": "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"查询去年的 year }).sort({"year": -1}).limit(1) 并在第二步查询中 find({"stock": "Stockx", "year": maxyearforStockx"} )。是否有更优雅的方式使用 findaggregate 命令来执行此操作?

任何帮助将不胜感激!

最佳答案

  1. $sort - 按年份降序排序。
  2. $group - 按股票年份分组。
  3. $group - 按 stock 分组并获取 stockYearItems 的第一项(从 2 开始)。
  4. $unwind - 将 items.stockYearItems 数组解构为多个文档。
  5. $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 上每个其他不同字段的字段最大的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70181954/

相关文章:

javascript - Mongoose Model.find() 方法在生产环境中损坏的问题

Node.js 驱动程序 "mongodb"findAndModify() 的实现 - 如何指定字段?

java - 如何使用Jedis获取redis服务器的系统时间?

javascript - Total.js CMS 将所有完整页面导出到文件夹

mongodb - Mongoose findByIdAndUpdate 不会在插入时生成 _id

javascript - Mongoose 传递类函数

mongodb - 计算文档中数组内元素的总数 - MongoDB

mysql - 如何使用 MongoDB 聚合对唯一 ID 进行求和?

javascript - concat 不被 mongodb 识别

firebase - 在 firebase 上构建数据的最佳方式是什么?