distinct()最快但仅支持单字段去重,返回纯数组;字段名须为字符串字面量,嵌套字段点号合法但空值文档被跳过;空字符串、null、undefined视为不同值;需条件过滤或频次统计时应改用$group聚合。
如果你只需要一个字段的所有不重复值(比如所有不同的 city),distinct() 是最轻量的选择。它不走聚合管道,服务端开销小、响应快。
TypeError: string expected
"user.profile.city" 允许用点号,但若某文档中 user 为 null 或缺失,该文档会被静默跳过""、null、undefined 在 distinct() 中视为不同值;而聚合的 $group 通常把 null 和缺失字段归为同一组["bj", "sh"]),不带任何元信息——没计数、没排序、没法过滤一旦你需要“只查 status=active 的用户的城市”或者“每个城市有多少人”,distinct() 就不够用了。这时候得用 aggregate() + $group。
$group 默认把分组键塞进 _id 字段,比如 { "_id": "bj" } 或 { "_id": { "city": "bj", "country": "cn" } }
$group 里加 count: { $sum: 1 },别想着先 distinct() 再对每个值调 countDocuments(),性能差好几个数量级$sort: { count: -1 } 就行;想筛掉只出现一次的?后面接 $match: { count: { $gt: 1 } }
当你需要联合去重两个字段(比如 organizationId 和 organizationName),并映射成 Java 的 OrganizationDTO,光用 GroupOperation 会返回空对象——因为默认结构是 { "_id": { "organizationId": "...", "organizationName": "..." } },而 DTO 没有 _id 这个嵌套层级。
ProjectionOperation,把 _id.organizationId 提升为顶层 organizationId
.andExclude("_id"),否则反序列化时 Jackson 会试图把整个 _id 对象塞进 DTO 的某个字段,导致字段不匹配、值为 null$first 比 $push 更安全;但注意 $first 不保证取到的是“最早”文档的值,只是组内任意一个非空值报错 Command failed: distinct command is only supported on replica sets and sharded clusters,大概率不是 MongoDB 版本问题,而是客户端配置误导了驱动。
?replicaSet=rs0 ——删掉它,单节点也能跑 distinct()
mongodbcollection::distinct() 和 Spring 的 mongoTemplate.findDistinct() 行为一致,但 Spring 的方法不支持多字段,这点容易踩坑distinct() 和聚合之间反复横跳,最后发现不是少了个 $project,就是连错环境白调半天。 Tplink企业版路由器WiFi名称的默认设置介绍(Tplink企业版路由器WiFi名称的默认设置是什么)
Tplink路由器灯常亮无法上网的原因分析(如何解决Tplink路由器灯常亮无法上网的问题)
Tplink千兆企业级路由器自动重启的作用和优势介绍(如何设置Tplink千兆企业级路由器自动重启功能)
一根天线的tplink路由器有哪些(一根天线的Tplink路由器的特点和优势介绍)
tplink路由器外网访问不了nas(Tplink路由器外网访问NAS的原因分析)
Tplink无法搜到路由器的原因分析(如何解决Tplink无法搜到路由器的问题)