MongoDB如何查询E-Mail与Password双字段同时重复的完整文档
MongoDB 重复文档查询与去重聚合方案
1. 输出所有重复完整文档用于比对
通过$$ROOT系统变量存储分组内全量文档,展开后即可得到所有重复项的完整内容:
db.your_collection_name.aggregate([ // 按E-Mail、Password双字段分组 { $group: { _id: { email: "$E-Mail", password: "$Password" }, // 存储分组内所有完整文档 repeat_docs: { $push: "$$ROOT" }, // 统计重复次数 count: { $sum: 1 } } }, // 仅保留存在重复的分组 { $match: { count: { $gt: 1 } } }, // 展开文档数组,得到每条重复文档的独立条目 { $unwind: "$repeat_docs" }, // 可选:将文档内容调整为根层级输出,格式和普通find查询一致 { $replaceRoot: { newRoot: "$repeat_docs" } } ])
2. 单条聚合语句实现重复数据删除
使用$out阶段可直接在聚合管道末尾完成去重后的集合覆盖,操作前务必先注释掉$out阶段验证结果,避免数据丢失:
db.your_collection_name.aggregate([ // 可选:按_id升序排序,保证保留最早创建的文档;按_id降序则保留最新的 { $sort: { _id: 1 } }, // 按双字段分组,每组仅保留第一条文档 { $group: { _id: { email: "$E-Mail", password: "$Password" }, reserved_doc: { $first: "$$ROOT" } } }, // 恢复文档的原始结构 { $replaceRoot: { newRoot: "$reserved_doc" } }, // 输出结果覆盖原集合,完成去重;也可写入新集合避免误操作 { $out: "your_collection_name" } ])
注意事项
- 如果需要自定义保留规则(如保留最近更新的文档),可将
$sort阶段的排序字段改为对应的更新时间字段即可。 - 10条测试数据量级极小,可先执行查询逻辑确认重复项后再执行去重操作。
内容的提问来源于stack exchange,提问作者StudentPaul
相关产品推荐
相关产品推荐

