1. 程式人生 > 實用技巧 >PyMongo去除重複資料

PyMongo去除重複資料

轉載自:李冬琳的部落格 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

  參考1
  參考2

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