Visitor Trends

Daily blog stats and creator awards

Today

Yesterday

Total

Posts

0

2023 IT Creator
2024 Foodie
2025 News Creator

Latest Posts

Fresh thoughts and recent updates from the blog

tistory view

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
반응형
Comments