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

MongoDB如何获取两个字段唯一组合对应的最新文档

你可以通过MongoDB的聚合管道直接在数据库层完成该过滤逻辑,具体查询语句如下:

兼容所有MongoDB版本的写法

// 请将your_collection替换为实际的集合名
db.your_collection.aggregate([
  // 按创建时间倒序排列所有文档,保证每个组合的最新文档排在最前
  { $sort: { created: -1 } },
  // 按primaryId和secondaryIdx的组合进行分组
  {
    $group: {
      _id: {
        primaryId: "$primaryId",
        secondaryIdx: "$secondaryIdx"
      },
      // 取每组的第一个文档(即创建时间最新的完整文档)
      latestDoc: { $first: "$$ROOT" }
    }
  },
  // 将存储的最新文档恢复为原始结构返回
  { $replaceRoot: { newRoot: "$latestDoc" } },
  // 可选:如果需要对最终结果排序可新增该阶段,示例为按创建时间升序排列
  { $sort: { created: 1 } }
])

MongoDB 5.2及以上版本的高性能写法

如果你的MongoDB版本在5.2及以上,可以使用$top运算符省去全局排序步骤,进一步提升查询性能:

db.your_collection.aggregate([
  {
    $group: {
      _id: {
        primaryId: "$primaryId",
        secondaryIdx: "$secondaryIdx"
      },
      latestDoc: {
        $top: {
          sortBy: { created: -1 },
          output: "$$ROOT"
        }
      }
    }
  },
  { $replaceRoot: { newRoot: "$latestDoc" } }
])

如果需要提前过滤不需要的数据,可以在聚合的最开头添加$match阶段缩小查询范围,比如仅查询2021年之后的数据:

{ $match: { created: { $gte: ISODate("2021-01-01T00:00:00Z") } } }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:27:03