Mongoose如何使用aggregate实现与distinct相同的字符串数组返回效果
要实现和 model.find().distinct("some_field") 完全一致的返回效果,你可以使用如下聚合管道:
model.aggregate([ // 匹配存在目标字段且值不为null的文档,对齐原生distinct的默认行为 { $match: { "some_field": { $exists: true, $ne: null } }}, // 按目标字段分组,完成值去重 { $group: { _id: "$some_field" }}, // 把所有去重后的值合并为单个数组 { $group: { _id: null, result: { $push: "$_id" } }}, // 输出纯净的数组结果,去掉多余的_id字段 { $project: { _id: 0, result: 1 }} ])
补充说明
- 原生
distinct默认会自动忽略字段不存在或字段值为null的文档,所以聚合管道第一步必须加$match过滤,否则返回结果会多出来一个null值,和原生结果不一致。 - 执行聚合后返回的结果是一个长度为1的数组,取第一个元素的
result属性,就能得到和distinct完全相同的字符串数组。 - 如果你不需要严格对齐原生distinct的null过滤逻辑,也可以省略第一步的
$match阶段。
内容的提问来源于stack exchange,提问作者nik
相关产品推荐
相关产品推荐

