MongoDB 4.4+如何查询同一部门下同邮箱对应多userID的异常记录
MongoDB 同部门同邮箱多userID异常记录查询方案
适用版本
MongoDB 4.4 及以上版本
核心思路
先按 部门(dept) + 邮箱(email) 分组,统计每组内去重后的 userID 数量,筛选出数量大于1的违规分组,再关联拉取该分组下所有原始记录即可。
完整查询语句
将语句中的 yourCollectionName 替换为你实际的集合名即可执行:
db.yourCollectionName.aggregate([ // 步骤1:按部门+邮箱分组,收集去重userID、对应所有原始记录 { $group: { _id: { dept: "$dept", email: "$email" }, distinctUserIds: { $addToSet: "$userID" }, records: { $push: "$$ROOT" } } }, // 步骤2:筛选出同部门同邮箱对应多个不同userID的违规分组 { $match: { $expr: { $gt: [ { $size: "$distinctUserIds" }, 1 ] } } }, // 步骤3:展开所有违规记录,可直接拿到单条异常数据 { $unwind: "$records" }, // 步骤4:格式化输出,直接返回原始异常文档结构 { $replaceRoot: { newRoot: "$records" } } ])
结果说明
针对你给出的样例数据,该语句会返回 dept:A、email:bob@example.com 下的3条全部记录,正好命中你标注的异常场景。
如果你只需要查看哪些部门+邮箱组合违规,不需要返回所有原始异常记录,删除最后两步的$unwind和$replaceRoot即可,输出结果会直接展示违规的部门、邮箱、对应的多个不同userID列表。
额外建议
清理完现有异常数据后,你可以在业务逻辑层增加同部门同邮箱提交前校验userID唯一性的逻辑,避免后续再产生违规数据。
内容的提问来源于stack exchange,提问作者anonymousaaron
相关产品推荐
相关产品推荐

