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.
相关产品推荐
相关产品推荐

