Projection
Limit
Sort
Indexing
Projection
MongoDB에서 프로젝션은 필요한 데이터만 선택하는 것을 의미
document의 전체 데이터를 선택하는 것보다 낫다
만약 document가 5개 필드를 갖고 3개 필드를 보여주고 싶다면 3개 필드만 선택하면 된다.
find()는 검색하려는 필드 목록인 두번째 선택적인 매개변수를 허용한다.
필드의 리스트를 1 또는 0으로 설정해야 한다.
1은 필드를 보여주기 위함 0은 필드를 숨기기 위함
projection과 사용하는 find()함수
db.collection_name.find({},{KEY:1})
mycol이라는 콜렉션이 다음과 같은 데이터를 가진다고 가정하면
find함수를 사용하면 다음과 같은 결과가 나온다.
MongoDB에서 레코드를 제한하기 위해 limit()함수를 쓴다.
이 함수는 하나의 숫자형 인수를 허용한다. 그 숫자는 보여주고 싶은 document의 개수이다.
db.collection_name.find().limit(number)
mycol 콜렉션이 다음의 데이터를 갖는다면
오직 2개의 document만 나타난다.
limit()함수의 인수를 정해주지 않으면 콜렉션의 모든 document가 출력된다.
Skip()
숫자형 인수를 허용한다. document의 숫자를 생략하기 위해 사용된다.
db.collection_name.find().limit(number).skip(number)
다음 예는 오직 두번째 document만을 보여줄 것이다.
sort()
MongoDB에서 document를 정렬하기 위해 sort() 함수를 쓴다.
이 함수는 정렬 순서와 함께 필드 목록을 포함하는 document를 허용한다.
1은 오름차순 -1은 내림차순
db.collection_name.find().sort({KEY:1})
id는 제외하고 title을 표시한다음 title을 기준으로 내림차순 정렬한다. T, N, M 순으로 나옴
What is indexing?
index가 뭐지? 왜 유용하지?
두꺼운 책을 보면 맨 뒤쪽에 용어를 정리해놓는다. 그 용어 옆에는 그 용어가 사용된 쪽수가 나온다. 만약 대한민국이라는 용어를 찾으려면 첫 페이지부터 끝 페이지까지 뒤져봐야하지만 몇 페이지에 있는 지 알면 1분안에 찾을 수 있다.
index를 사용해야 할 때와 사용하지 말아야 할 때?
index의 내부 구조는 B-Tree로 되어있다. (B-트리의 창시자인 루돌프 바이어는 'B'가 무엇을 의미하는지 따로 언급하지는 않았다. 가장 가능성 있는 대답은 리프 노드를 같은 높이에서 유지시켜주므로 균형잡혀있다(balanced)는 뜻에서의 'B'라는 것이다. '바이어(Bayer)'의 'B'를 나타낸다는 의견도, 혹은 그가 일했던 보잉 과학 연구소(Boeing Scientific Research Labs)에서의 'B'를 나타낸다는 의견도 있다.)
1부터 10까지의 정수를 가지고 B-Tree를 생성해보자.
인덱스는 검색 결과에는 영향을 미치지 않는다. 검색 속도를 향상시켜준다.
한 콜렉션에 1백만개의 document를 만들고 explain()함수를 써서 MongoDB가 질의를 실행할 때 뭘 하는지 살펴보자.
username이 user101인 것을 찾기 위해 어쨌든 100만개를 스캔해야만 했다.
limit(1)을 써서 1개만 출력하는 것으로 제한한다면 user101을 찾자마자 탐색을 끝낸다. user0부터 시작하므로 user101은 102번째다.
그러나 이건 비실용적이다. 99만 9999번을 찾고 싶다면 어쨌든 여전히 100만번째까지 탐색을 해야하기 때문이다.
그러므로 index는 이러한 질의를 수정하기에 좋은 방법이다. index는 주어진 필드로 데이터를 구성해 MongDB가 이걸 빠르게 찾도록 한다.
username filed에 index 생성
db.users.ensureIndex( { "username" : 1 } )
index가 제대로 완료되면 원래 질의를 다시 시도해본다.
1개만 찾고 끝난다.
복합 index 생성
ensureIndex() 함수에서 여러 필드를 전달해 여러 필드에 index를 만들 수 있다.
db.mycol.ensureIndex({"username" : 1, "age : -1"})
내장된 문서의 키에 index를 생성할 수 있다.
db.users.ensureIndex({"loc.city" : 1})
loc이라는 키의 값에 객체가 있는데 그 객체 안에 있는 city를 indexing
indexing을 위한 옵션 - Background
MongoDB는 index를 foreground에서 한다. index가 생성되는 동안 데이터베이스에 모든 읽기 쓰기 연산을 방지한다.
Background indexing 구조를 사용하면 index를 생성하는 동안 읽기 쓰기를 할 수 있다.
db.collection.createIndex({a : 1}, {background : true})
indexing을 위한 옵션 - Unique
unique index는 인덱싱된 필드가 중복된 값을 갖지 않게 보장한다.
db.collection.createIndex({"user_id" : 1}, {unique : true})
'과목 > 빅데이터' 카테고리의 다른 글
MongoDB 개요 (0) | 2018.04.27 |
---|---|
MongoDB installation 몽고디비 설치 (0) | 2018.04.21 |
Aggregation (0) | 2018.04.20 |
MongoDB 개요 및 간단 설명 (0) | 2018.04.20 |
NoSQL Databases (0) | 2018.04.19 |