티스토리 뷰
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
반응형
'프로그래밍 > Python' 카테고리의 다른 글
[Python2.7] Python2에서 pip 설치 방법 (0) | 2021.09.13 |
---|---|
[Python3] 리눅스/Windows에서 python gmpy, gmpy2 설치 방법 (0) | 2021.09.13 |
[pymongo] aggregate 검색하기 (match+group+project+sort) (0) | 2021.08.06 |
[pymongo] find + distinct 사용하기 (0) | 2021.08.02 |
[folium] 오류해결- marker popup 에서 한글 깨짐 현상 (0) | 2021.07.05 |
댓글