我需要从收藏集中删除重复的文档。但是,它需要删除按名称重复但不属于同一类别的重复项。例如;
Collection =产品
Product {
id: ...
name:"Apple"
category:"Fruit"
}
Product {
id: ...
name:"Apple"
category:"Fruit"
}
Product {
id: ...
name:"Apple"
category:"New Fruit"
}
因此最终结果将是两个文档。两者都有苹果的名字,但一个是“新水果”类别,一个是“水果”
干杯。
答案 0 :(得分:0)
我们可以使用 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 });
}
} );
答案 1 :(得分:0)
以下聚合查询收集按_id
和name
字段分组的category
。 $project
阶段仅保留重复的_id
进行删除。最后,删除操作将删除由其_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 } } ) )