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

MongoDB聚合查询:保留最新版本文档的全部字段

查询MongoDB中每个规则的最新版本记录(保留完整字段)

问题场景

现有如下结构的MongoDB文档:

{"rule_id": "rule_1", "description": "desc_rule_1_version_1", "version": 1},
{"rule_id": "rule_1", "description": "desc_rule_1_version_2", "version": 2},
{"rule_id": "rule_2", "description": "desc_rule_2_version_1", "version": 1}

需要获取每个rule_id对应的最新版本记录,同时保留文档的全部字段,预期结果:

{"rule_id": "rule_1", "description": "desc_rule_1_version_2", "version": 2},
{"rule_id": "rule_2", "description": "desc_rule_2_version_1", "version": 1}

解决方案

方法一:分组存文档后筛选

通过聚合管道先分组记录最大版本号,再筛选对应文档:

db.collection.aggregate([
  // 按rule_id分组,记录最大版本号及组内所有文档
  {
    $group: {
      _id: "$rule_id",
      maxVersion: { $max: "$version" },
      docs: { $push: "$$ROOT" }
    }
  },
  // 展开文档数组
  { $unwind: "$docs" },
  // 筛选出版本号等于最大版本的文档
  {
    $match: {
      $expr: { $eq: ["$docs.version", "$maxVersion"] }
    }
  },
  // 恢复原文档结构
  {
    $replaceRoot: { newRoot: "$docs" }
  }
])

方法二:排序后分组取首项(更高效)

先按规则ID和版本号排序,确保最新版本排在组内首位,再直接取首项:

db.collection.aggregate([
  // 按rule_id升序、version降序排序,让每个规则的最新版本排第一
  {
    $sort: { rule_id: 1, version: -1 }
  },
  // 按rule_id分组,取组内第一个文档(即最新版本)
  {
    $group: {
      _id: "$rule_id",
      latestDoc: { $first: "$$ROOT" }
    }
  },
  // 恢复原文档结构
  {
    $replaceRoot: { newRoot: "$latestDoc" }
  }
])

说明

  • 方法二性能更优,因为排序后直接分组取首项,避免了后续的展开和匹配操作
  • $$ROOT代表当前处理的完整文档,确保能保留所有原始字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:40:44