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}}) })
可以看到,已经删除重复数据