MongDB中刪除重復數據
目的:數據庫中存儲幾萬甚至幾十萬條數據,而mongdb數據庫中存在完全重復的多條數據,要刪除整個記錄,而不是某個字段。若采用python腳本,則速度慢。故采用數據庫操作命令aggregrate速度很快。
1、查詢存在重復的數據:
db.xywy_same_39_copy.aggregate([
? ? {
? ? ? ? $group: { _id: {disease_name: '$disease_name'},count: {$sum: 1},dups: {$addToSet: '$_id'}}
? ? },
? ?{
? ? ? ? $match: {count: {$gt: 1}}
? ? }
])
結果如圖所示:
(其中:count:表示該記錄出現的次數,dups:返回重復記錄對應的id)
2、刪除重復記錄
在查詢的基礎上添加forEach語句
如下代碼(在查詢基礎上,添加的代碼已加粗):
db.xywy_same_39_copy.aggregate([
? ? {
? ? ? ? $group: { _id: {disease_name: '$disease_name'},count: {$sum: 1},dups: {$addToSet: '$_id'}}
? ? },
? ? {
? ? ? ? $match: {count: {$gt: 1}}
? ? }
]).forEach(function(doc){
? ? doc.dups.shift();
? ? db.xywy_same_39_copy.remove({_id: {$in: doc.dups}});
})
說明:
1、xywy_same_39_copy代表對應操作的collection
2、根據userName和age分組并統計數量,$group只會返回參與分組的字段,使用$addToSet在返回結果數組中增加_id字段
3、使用$match匹配數量大于1的數據
4、doc.dups.shift();表示從數組第一個值開始刪除;作用是踢除重復數據其中一個_id,讓后面的刪除語句不會刪除所有數據
5、使用forEach循環根據_id刪除數據