[MongoDB] find 각종 문법 / 인덱싱(indexing) / 필드 추가, 변경 및 삭제 - Pymongo

조상래·2021년 6월 5일
0

MongoDB

목록 보기
5/5
post-thumbnail

OP.GG에서 추출한 데이터 (랭킹 1 ~ 200위)를 가지고 find 및 indexing을 이용해 데이터를 분석해 볼 것이다. 그리고 간단한 필드 추가, 변경 및 삭제까지 해볼 것이다.

1. Find

1) .limit() / .skip()

- 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)

2) .sort()

- 조회한 데이터를 정렬할 때 사용한다.
- 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)

3) $exist

- True / False의 값을 주어 해당 칼럼이 존재하는 / 존재하지 않는 데이터만 조회.
ex) 소속팀이 있는 유저들만 조회 (소속팀 이름은 임의로 생성)

temp = db_opgg_rank.find({'소속팀': {'$exists': True}}, {'소속팀': 1, '닉네임': 1, '_id': 0})

4) $gte / $gt / $lte / $lt / $or / $in...

- 각종 비교 문법 사용가능.
ex) 순위가 5등 이상이거나 195등 이하인 유저들을 조회해보자.

temp = db_opgg_rank.find({'$or': [{'순위': {'$lte': 5}}, {'순위': {'$gte': 195}}]}, {'닉네임': 1, '순위': 1, '_id': 0})

for i in temp:
  print(i)

5) $elemMatch

- 배열(리스트)의 요소 중 조건에 만족하는 요소를 조회할 때.
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)

6) Array(List) 관련

- 단순한 문자열이나, 숫자등의 형태로 나열된 배열(리스트)를 검색할 때.

!(전시즌 티어는 몇몇의 유저에게 임의로 생성 인덱스 번호가 낮을 수록 최근 시즌)

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)

2. 인덱싱(Indexing)

- MongoDB에서의 인덱스는 검색을 더 빠르게 수행하기 위해 만든 데이터구조이다. 만약 인덱스가 없다면 모든 데이터를 하나씩 조회하기 때문에 조회가 비교적 느리다.
- 콜렉션 내의 필드를 기준으로 생성이 가능하다.
- 단일 인덱스, 복합 인덱스 등등 원하는 형태로 인덱스 생성 가능.

1) .index_information()

- 인덱스가 생성된 필드를 조회할 때 사용.
- 기본적으로 '_id' 필드에 대한 인덱스가 생성 되어있다.

print(db_opgg_rank.index_information())

2) .create_index()

- 필드를 지정하여 인덱스를 생성할 수 있다.
- 조건에는 1(오름차순), -1(내림차순), 'text'(텍스트 검색)가 있다.

db_opgg_rank.create_index('순위')
db_opgg_rank.create_index([('모스트챔피언', 'text')])

print(db_opgg_rank.index_information())

3) .drop_indexes() / .drop_index()

- .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)

3. 필드 추가, 변경 및 삭제

1) 필드 추가

- 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)

2) 필드 변경

- 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)

3) 필드 삭제

- 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)

(참고: NoSQL DB (몽고DB/mongodb) 기본부터 파이썬/데이터분석 활용까지! - 잔재미코딩)

profile
Codestates Full IM26기 수료

0개의 댓글