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