mongodb删除重复数据保留一条

1.问题引入

标红字段可能存在重复数据,需删除重复数据保留一条
《mongodb删除重复数据保留一条》

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严格区分大小写***,说三遍!

    原文作者:生有涯,知无涯
    原文地址: https://blog.csdn.net/qq_38923792/article/details/108769910
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞