MongoDB查找统计所有重复数据并返回总数
在实际开发过程中,遇到了千万级数据量的数据库表中存在重复数据。虽然可以通过编写java脚本查找去重,但不如直接使用 mongo 查询语句操作来得方便,以下为返回所有重复数据,统计重复数据总数和删除重复数据的具体操作:1. 返回 shipDivide 表中所有重复数据的具体信息:db.getCollection('shipDivide').aggregate([{'$group': {'_id':
·
在实际开发过程中,遇到了千万级数据量的数据库表中存在重复数据。虽然可以通过编写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}})
})
可以看到,已经删除重复数据
更多推荐
已为社区贡献3条内容
所有评论(0)