03 mongo删除重复数据
mongo 删除重复数据¶
背景¶
1、 mongo 再创建唯一索引时候,发现报错,说数据库中存在重复的值
$ db.getCollection("cmzhu-test").createIndex({projectId: 1, method: 1, matchUrl: 1}, {background:true, name:"udx_projectId_method_matchUrl", unique:true});
MongoServerError[DuplicateKey]: Index build failed: 29fee8a4-2ee1-40b1-96f1-99772b27b53b: Collection atp-test.cmzhu-test ( eff5cb37-b7b7-49e0-8019-b1858daa120a ) :: caused by :: E11000 duplicate key error collection: atp-test.atp_api_perspective index: cmzhu-test dup key: { projectId: "1814199950649589760", method: "POST", matchUrl: "/outaddresspaging" }
发现是数据库中存在重复数据
解决思路¶
删除重复的数据即可, 可参照以下的脚本, 需要删除以projectId
、 method
、 matchUrl
存在的重复数据, 具体可参照下面命令;
const duplicates = db.atp_api_perspective.aggregate([
{
$group: {
_id: {
projectId: "$projectId",
method: "$method",
matchUrl: "$matchUrl"
},
ids: { $push: "$_id" }, // 收集所有重复文档的 _id
count: { $sum: 1 }
}
},
{
$match: {
count: { $gt: 1 } // 只选择出现次数大于 1 的组合
}
}
]).map(doc => doc.ids.slice(1)); // 只保留每组中的多余 _id
// 第二步:打印待删除的内容并删除重复文档
duplicates.forEach(idArray => {
// 查找待删除的文档内容
const documentsToDelete = db.atp_api_perspective.find({ _id: { $in: idArray } }).toArray();
// 打印待删除的文档
print("Documents to delete:");
printjson(documentsToDelete);
// 删除重复文档
db.atp_api_perspective.deleteMany({ _id: { $in: idArray } });
});