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

MongoDB中如何按stream去重并保留_id字段

解决MongoDB按字段去重并保留指定字段的问题

我懂你的需求——你需要按stream字段去重,同时保留每个分组对应的_id和stream字段,但distinct()方法只能返回单纯的字段值数组,确实满足不了这个需求。这里推荐用MongoDB的聚合管道来实现,通过$group和$project阶段组合就能搞定:

聚合查询示例

db.yourCollectionName.aggregate([
  // 按stream字段分组,取每个组内第一条文档的_id
  {
    $group: {
      _id: "$stream",
      originalId: { $first: "$_id" }
    }
  },
  // 重新格式化输出字段,匹配你想要的结构
  {
    $project: {
      _id: "$originalId",
      stream: "$_id",
      __v: 0 // 不需要的字段直接排除
    }
  }
])

代码逻辑解释

  • $group阶段:以stream的值作为分组依据(_id: "$stream"),用$first运算符抓取每个分组里第一条文档的_id,存到originalId字段中。如果想取分组里最后一条文档的_id,把$first换成$last就行。
  • $project阶段:重新构造输出文档的结构,把originalId赋值给_id,把分组的stream值(也就是$group阶段的_id)赋值给stream字段,同时剔除不需要的__v字段。

预期输出结果

运行上述查询后,会得到完全符合你预期的结果:

{ "_id" : ObjectId("5d5aa6b5cced8d2cac81e7d7"), "stream" : "Programming" }
{ "_id" : ObjectId("5d5aa6d2cced8d2cac81e7d8"), "stream" : "Basic" }

如果你的业务有特殊需求(比如要选某个特定条件的_id),还可以在$group阶段结合$max、$min等运算符调整逻辑,灵活性很高。

内容的提问来源于stack exchange,提问作者J.K.A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:48:58