티스토리 뷰

728x90
반응형

 

 

 

특정 컬럼을 기준으로 중복값이 들어가있는지 확인하고,

중복데이터를 제거하는 방법입니다.

 

일단 중복되는 값이 2개 이상인 데이터들만 가져옵니다!

 

cursor = db.collection.aggregate(
    [
        {"$group": {"_id": "$컬럼명", "unique_ids": {"$addToSet": "$_id"}, "count": {"$sum": 1}}},
        {"$match": {"count": { "$gte": 2 }}}
    ]
)

 

cursor를 list형으로 변환해서 출력해보면,

중복데이터들이 딕셔너리형태로 리스트 안에 들어있습니다.

cursor list의 length가 길어질수록 중복데이터가 많이 나타난 것입니다.

count는 특정컬럼명의 값이 동일한 데이터의 개수에요.

 

아래는 count가 2개인 경우의 형태.

또 아래는 count가 3개인 경우의 형태입니다.

 

list형으로 변환한 cursor를 for문으로 돌면서,

중복되어 나타난 _id들을 response라는 리스트 안에 담습니다.

중복데이터들이니 response리스트에 모아서 한번에 제거해줄거에요.

 

response = []
for doc in list(cursor):
    del doc["unique_ids"][0]
    for id in doc["unique_ids"]:
        response.append(id)

 

아래와 같이 $in을 사용해서

리스트에 담긴 중복데이터의 _id들을 한방에 지울 수 있습니다

 

db.collection.remove({"_id": {"$in": response}})

 

예를들어,

컬렉션에 들어있는 데이터의 개수가 총 3개이고,

3개 모두 아래와 같이 id가 같을 때,

{'id':1, 'name': 'A'}

{'id':1, 'name': 'B'}

{'id':1, 'name': 'C'}

 

id 컬럼명을 기준으로 중복데이터를 제거하면,

{'id':1, 'name': 'A'} 하나만 남게됩니다.

왜냐하면 위에서 response 리스트에 담을 때

0번째 인덱스의 id만 제외하고 나머지 중복데이터들을 다 지웠기 때문이에요.

중복데이터 중 어떤 데이터를 남길지는,

response 리스트에 제거할 데이터의 _id를 담는 코드를 수정하면 되겠죵??

 

 

끝입니다!

 

 

728x90
반응형
댓글