OP.GG에서 추출한 데이터 (랭킹 1 ~ 200위)를 가지고 find 및 indexing을 이용해 데이터를 분석해 볼 것이다. 그리고 간단한 필드 추가, 변경 및 삭제까지 해볼 것이다.
- limit(n) 로 조회한 데이터 중 n개만 보여지도록 설정이 가능하다.
ex) 랭킹 상위 10명의 데이터를 보고 싶다.
temp = db_opgg_rank.find({}, {'닉네임': 1, '순위':1, '_id':0}).limit(10)
for i in temp:
print(i)
- skip(n) 을 이용해 조회한 데이터 중 n개를 제외한 데이터를 조회 가능하다.
ex) 190 ~ 200등 유저들의 데이터를 보고싶다.
temp = db_opgg_rank.find({}, {'닉네임': 1, '순위':1, '_id':0}).skip(189)
for i in temp:
print(i)
- 두개의 문법을 조합해 사용할 수 있다.
ex) 20 ~ 30등 유저들의 데이터를 보고싶다.
temp = db_opgg_rank.find({}, {'닉네임': 1, '순위':1, '_id':0}).skip(19).limit(11)
for i in temp:
print(i)
- 조회한 데이터를 정렬할 때 사용한다.
- pymongo.DESCENDING / pymongo.ASCENDING 의 형태로 내림차순, 오름차순 정렬이 가능하다.
ex) 레벨이 높을 수록 순위가 높을까? 레벨 상위 10명의 데이터를 조사해보자.
temp = db_opgg_rank.find({}, {'닉네임': 1, '순위': 1, '레벨': 1, '_id': 0}).sort('레벨', pymongo.DESCENDING).limit(10)
for i in temp:
print(i)
분석한 결과 레벨과 순위가 비례하는 것은 아니다.
- 여러개의 조건을 리스트의 형태로 적용할 수 있다. 다만 앞서 나온 필드가 우선 적용된다.
ex) 위의 조건으로 레벨이 같을 경우 순위가 더 높은 사람이 먼저 나오게 조회를 하자.
temp = db_opgg_rank.find({}, {'닉네임': 1, '순위': 1, '레벨': 1, '_id': 0}).sort([('레벨', pymongo.DESCENDING), ('순위', pymongo.ASCENDING)]).limit(10)
- True / False의 값을 주어 해당 칼럼이 존재하는 / 존재하지 않는 데이터만 조회.
ex) 소속팀이 있는 유저들만 조회 (소속팀 이름은 임의로 생성)
temp = db_opgg_rank.find({'소속팀': {'$exists': True}}, {'소속팀': 1, '닉네임': 1, '_id': 0})
- 각종 비교 문법 사용가능.
ex) 순위가 5등 이상이거나 195등 이하인 유저들을 조회해보자.
temp = db_opgg_rank.find({'$or': [{'순위': {'$lte': 5}}, {'순위': {'$gte': 195}}]}, {'닉네임': 1, '순위': 1, '_id': 0})
for i in temp:
print(i)
- 배열(리스트)의 요소 중 조건에 만족하는 요소를 조회할 때.
ex) 카이사(Kai`Sa)를 모스트챔피언 중에 하나로 이용하는 유저 중 분당CS가 9개를 넘기는 유저 세명 조회.
temp = rank.find({'모스트챔피언': {'$elemMatch': {'챔피언이름': "Kai'Sa", '분당CS': {'$gte': 9}}}}, {'닉네임': 1, '모스트챔피언': {'챔피언이름': 1, '분당CS': 1}, '_id': 0}).limit(3)
for i in temp:
print(i)
- 단순한 문자열이나, 숫자등의 형태로 나열된 배열(리스트)를 검색할 때.
!(전시즌 티어는 몇몇의 유저에게 임의로 생성 인덱스 번호가 낮을 수록 최근 시즌)
ex) 각 시즌 티어들 중 한번이라도 골드 였던 적이 있는 유저를 조회.
temp = db_opgg_rank.find({'전시즌티어': '골드'}, {'닉네임': 1, '_id': 0, '전시즌티어': 1})
- 인덱스 번호로 검색 가능하다.
ex) 직전 시즌 첼린저였던 사람 유저.
temp = db_opgg_rank.find({'전시즌티어.0': '첼린저'}, {'닉네임': 1, '_id': 0, '전시즌티어': 1})
for i in temp:
print(i)
- $all을 이용해 모든 조건에 해당하는 데이터 조회 가능.
ex) 각 시즌 티어 중 첼린저와 그랜드마스터 모두 였던 적이 있는 유저.
temp = db_opgg_rank.find({'전시즌티어': {'$all': ['첼린저', '그랜드마스터']}}, {'닉네임': 1, '_id': 0, '전시즌티어': 1})
for i in temp:
print(i)
- MongoDB에서의 인덱스는 검색을 더 빠르게 수행하기 위해 만든 데이터구조이다. 만약 인덱스가 없다면 모든 데이터를 하나씩 조회하기 때문에 조회가 비교적 느리다.
- 콜렉션 내의 필드를 기준으로 생성이 가능하다.
- 단일 인덱스, 복합 인덱스 등등 원하는 형태로 인덱스 생성 가능.
- 인덱스가 생성된 필드를 조회할 때 사용.
- 기본적으로 '_id' 필드에 대한 인덱스가 생성 되어있다.
print(db_opgg_rank.index_information())
- 필드를 지정하여 인덱스를 생성할 수 있다.
- 조건에는 1(오름차순), -1(내림차순), 'text'(텍스트 검색)가 있다.
db_opgg_rank.create_index('순위')
db_opgg_rank.create_index([('모스트챔피언', 'text')])
print(db_opgg_rank.index_information())
- .drop_indexes()로 모든 인덱스 삭제 가능.
- .drop_index()로 특정 인덱스 삭제 가능.
db_opgg_rank.drop_index([('순위', 1)])
print(db_opgg_rank.index_information())
- $text는 $search와 함께 사용되며 'text'로 인덱싱이 된 필드를 조회할 때 사용한다.
- 공백을 기준으로 하나의 요소를 보고 각 요소가 포함된 모든 데이터를 조회
ex) 모스트챔피언 중 드레이븐(Draven), 징크스(Jinx)가 있는 유저 조회.
db_opgg_rank.create_index([('모스트챔피언.챔피언이름', pymongo.TEXT)])
print(db_opgg_rank.index_information())
temp = db_opgg_rank.find({'$text': {'$search': 'Draven jinx'}}, {'닉네임': 1, '모스트챔피언.챔피언이름': 1, '_id': 0}).limit(10)
for i in temp:
print(i)
- update 관련 메소드를 사용하여 추가가 가능하다.
db_opgg_rank.update_many({'순위': {'$gte': 1, '$lte': 10}}, {'$set': {'필드추가': '테스트'}})
temp = db_opgg_rank.find({'순위': {'$gte': 1, '$lte': 10}}, {'닉네임': 1, '순위': 1, '필드추가': 1, '_id': 0})
for i in temp:
print(i)
- update 관련 메소드를 이용하여 필드 안의 요소 뿐만아니라 $rename을 이용해 필드명 또한 변경 가능.
db_opgg_rank.update_many({'필드추가': {'$exists': True}}, {'$rename': {'필드추가': '필드명변경'}})
db_opgg_rank.update_many({'순위': {'$gte': 1, '$lte': 10}}, {'$set': {'필드명변경': '수정'}})
temp = db_opgg_rank.find({'순위': {'$gte': 1, '$lte': 10}}, {'닉네임': 1, '순위': 1, '필드명변경': 1, '_id': 0})
for i in temp:
print(i)
- update 관련 메소드와 $unset을 이용해 삭제 가능.
db_opgg_rank.update_many({}, {'$unset': {'필드명변경': 1}})
temp = db_opgg_rank.find({'순위': {'$gte': 1, '$lte': 10}}, {'닉네임': 1, '순위': 1, '필드명변경': 1, '_id': 0})
for i in temp:
print(i)