PyMongo去除重複資料
阿新 • • 發佈:2020-07-16
轉載自:李冬琳的部落格 URL:http://ldllidonglin.github.io/blog/2015/12/14/2015-12-14-mongodb%E5%8E%BB%E9%99%A4%E9%87%8D%E5%A4%8D%E6%95%B0%E6%8D%AE/
1. 唯一索引
db.things.ensureIndex({'key' : 1}, {unique : true, dropDups : true})
但是dropDups is not supported by MongoDB 2.7.5 or newer所以這個方法只能在2.7.5版本以下才行
2.用aggreate找出重複的資料,然後再一個一個刪除(效率比較低),python程式碼
#先找到重複的資料 deleteData=collection.aggregate([ {'$group': { '_id': { 'firstField': "$area", 'secondField': "$time_point" }, 'uniqueIds': { '$addToSet': "$_id" }, 'count': { '$sum': 1 } }}, { '$match': { 'count': { '$gt': 1 } }} ]); first=True for d in deleteData: first=True for did in d['uniqueIds']: if !first: #第一個不刪除 collection.delete_one({'_id':did}); first=False
3. 第二種方法當資料量很大的時候,需要把資料寫入表中。aggregate的pipeline中要加上out項,同時由於aggregate只接受兩個引數,self是預設的,所以要用allowDiskUse=True這種形式新增引數
# 找出重複的放入result表中 def findDuplicate(): deleteData=collection.aggregate([ {'$group': { '_id': { 'firstField': "$mid", 'secondField': "$created_at" }, 'uniqueIds': { '$addToSet': "$_id" }, 'count': { '$sum': 1 } } }, { '$match': { 'count': { '$gt': 1 } } },{'$out':'result'} ],allowDiskUse=True); def deleteDup(): deleteData=db.result.find() first=True for d in deleteData: first=True for did in d['uniqueIds']: if first==False: collection.delete_one({'_id':did}); first=False