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

如何在MongoDB中查询每个distinct字段对应最大字段值的所有文档

MongoDB单查询获取每个股票最新年份所有文档方案

你可以通过MongoDB的聚合框架单次查询完成需求,无需在业务代码中遍历执行多次查询,有两种常用实现方式:

  • 通用兼容版(支持所有MongoDB 3.6+版本)
db.yourCollectionName.aggregate([
  // 按stock分组,统计每个股票的最大年份
  {
    $group: {
      _id: "$stock",
      maxYear: { $max: "$year" }
    }
  },
  // 关联原集合,匹配当前股票+最大年份的全部文档
  {
    $lookup: {
      from: "yourCollectionName", // 替换为你的实际集合名称
      localField: "_id",
      foreignField: "stock",
      let: { currentMaxYear: "$maxYear" },
      pipeline: [
        { $match: { $expr: { $eq: ["$year", "$$currentMaxYear"] } } }
      ],
      as: "matchedDocs"
    }
  },
  // 展开匹配到的文档数组
  { $unwind: "$matchedDocs" },
  // 把匹配到的文档作为最终返回的根结构
  { $replaceRoot: { newRoot: "$matchedDocs" } }
])
  • 精简版(支持MongoDB 5.0+版本,使用窗口函数实现)
db.yourCollectionName.aggregate([
  // 按stock分区,给每个文档标注所属股票的最大年份
  {
    $setWindowFields: {
      partitionBy: "$stock",
      sortBy: { year: -1 },
      output: {
        stockMaxYear: { $max: "$year", window: { documents: ["unbounded", "unbounded"] } }
      }
    }
  },
  // 过滤出年份等于所属股票最大年份的文档
  { $match: { $expr: { $eq: ["$year", "$stockMaxYear"] } } },
  // 移除辅助计算的stockMaxYear字段
  { $unset: "stockMaxYear" }
])

两种方案返回的结果和你需求的输出完全一致,相比你现在多次查询的实现,性能和可维护性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:27:02