1.问题引入
标红字段可能存在重复数据,需删除重复数据保留一条
2. 聚合操作
db.defect_product_data.aggregate([
{
$group: { _id: {barcode: '$barcode', device_code: '$device_code', produce_process: '$produce_process', produce_user: '$produce_user',produce_shift: '$produce_shift'}, count: {$sum: 1},dups: {$addToSet: '$_id'}}
},
{
$match: {count: {$gt: 1}}
}
],
{allowDiskUse: true}
).forEach(function(doc){
doc.dups.shift();
db.defect_product_data.remove({_id: {$in: doc.dups}});
})
3.语句解析
- 1.根据可能重复的字段分组并统计数量, g r o u p 只 会 返 回 参 与 分 组 的 字 段 , 使 用 group只会返回参与分组的字段,使用 group只会返回参与分组的字段,使用addToSet在返回结果数组中增加_id字段
- 2.使用$match匹配数量大于1的数据
- 3
allowDiskUse: true
管道阶段的内存(RAM)限制为100 MiB(100 * 1024 * 1024字节)。如果一个阶段超出此限制,则MongoDB将产生错误。要允许处理大型数据集,可以在方法中设置 aggregate()方法的选项allowDiskUse。该allowDiskUse选项允许大部分的聚合管道操作将数据写入到一个临时文件。 - 4.doc.dups.shift();表示从数组第一个值开始删除;作用是踢除重复数据其中一个_id,让后面的删除语句不会删除所有数据
- 5.使用forEach循环根据_id删除数据
$addToSet
操作符只有在值没有存在于数组中时才会向数组中添加一个值。如果值已经存在于数组中,$addToSet
返回,不会修改数组。
注意:forEach
和$addToSet
的驼峰写法不能全部写成小写,因为***mongodb严格区分大小写、mongodb严格区分大小写、mongodb严格区分大小写
***,说三遍!