【问题标题】:Removing Duplicate Documents from collection mongodb从集合 mongodb 中删除重复的文档
【发布时间】:2019-12-27 14:18:36
【问题描述】:
我需要从我的收藏中删除重复的文档。但是,它需要删除按名称重复但不在同一类别中的内容。例如;
收藏=产品
Product {
id: ...
name:"Apple"
category:"Fruit"
}
Product {
id: ...
name:"Apple"
category:"Fruit"
}
Product {
id: ...
name:"Apple"
category:"New Fruit"
}
所以最终结果将是两个文档。两者都有名称 Apple,但一个属于“新水果”类别,一个属于“水果”
干杯。
【问题讨论】:
标签:
mongodb
mongodb-query
aggregation-framework
【解决方案1】:
我们可以使用foreach关键字删除重复记录,找到重复记录并删除记录,请看以下代码
db.demo1.find({}).forEach( function(myDoc) {
var condname=myDoc.name;
var condcat=myDoc.cat;
var countRecord=db.demo1.find( { name: condname, cat: condcat } ).count()
if(countRecord > 1)
{
db.demo1.deleteMany( {_id:{$ne: myDoc._id}, name: condname, cat: condcat });
}
} );
【解决方案2】:
以下聚合查询收集由name 和category 字段分组的_ids。 $project 阶段仅保留重复的 _ids 以供删除。最后,delete 操作删除了由_id 查询的重复文档。
db.test.aggregate( [
{
$group: {
_id: { n: "$name", c: "$category" },
all_ids: { $addToSet: "$_id" }
}
},
{
$project: {
dup_ids: { $slice: [ "$all_ids", 1, 9999999 ] },
_id: 0
}
}
] ).forEach( doc => db.test.deleteMany( { _id: { $in: doc.dup_ids } } ) )