MongoDB查找统计所有重复数据并返回总数

在实际开发过程中,遇到了千万级数据量的数据库表中存在重复数据。虽然可以通过编写java脚本查找去重,但不如直接使用 mongo 查询语句操作来得方便,以下为返回所有重复数据,统计重复数据总数和删除重复数据的具体操作:

1. 返回 shipDivide 表中所有重复数据的具体信息:

db.getCollection(shipDivide).aggregate([{
        $group: {
            _id: {
            mmsi: $mmsi,
            vesselname: $vesselname,
            type: $type,
            dt: $dt,
            flight_line: $flight_line,
            lon: $lon,
            lat: $lat,
            pos_time: $pos_time,
            speed: $speed,
            course: $course
            },
            uniqueIds: {
                $addToSet: $_id
            },
            count: {
                $sum: 1
            }
        }
    },
    {
        $match: {
            count: {
                $gt: 1
            }
        }
    }
],
{allowDiskUse: true}
)

重复数据已分类展示

2. 返回重复数据总量

加上 { "$count": "total" } 即可

db.getCollection(shipDivide).aggregate([{
        $group: {
            _id: {
            mmsi: $mmsi,
            vesselname: $vesselname,
            type: $type,
            dt: $dt,
            flight_line: $flight_line,
            lon: $lon,
            lat: $lat,
            pos_time: $pos_time,
            speed: $speed,
            course: $course
            },
            uniqueIds: {
                $addToSet: $_id
            },
            count: {
                $sum: 1
            }
        }
    },
    {
        $match: {
            count: {
                $gt: 1
            }
        }
    },
    { "$count": "total" }
],
{allowDiskUse: true}
)

3. 删除重复数据

db.getCollection(shipDivide).aggregate([{
        $group: {
            _id: {
            mmsi: $mmsi,
            vesselname: $vesselname,
            type: $type,
            dt: $dt,
            flight_line: $flight_line,
            lon: $lon,
            lat: $lat,
            pos_time: $pos_time,
            speed: $speed,
            course: $course
            },
            uniqueIds: {
                $addToSet: $_id
            },
            count: {
                $sum: 1
            }
        }
    },
    {
        $match: {
            count: {
                $gt: 1
            }
        }
    }
],
{allowDiskUse: true}
).forEach(function(doc)  {
       doc.uniqueIds.shift();
       db.shipDivide.remove({_id : {$in: doc.uniqueIds}})
})

可以看到,已经删除重复数据

经验分享 程序员 微信小程序 职场和发展