MongoDB-Index

2 minute read

Index

Index는 특정 문서를 탐색할 때 전부를 탐색하지 않고도 데이터를 찾을 수 있게 합니다.(속도 향상)
특정 데이터를 쉽게 추출할 수 있도록 인덱스 데이터를 변경하는 것이 특징이다.
RDBMS와 같이 내부적으로 B-Tree로 인덱스를 생성하며, 다중 속성과 고유인덱스를 사용하며 복합 인덱스를 작성할 수 있다.


B-Tree


출처:Namoosori-MongoDB(ver2.21) PDF

Index 종류

종류사용 환경
고유 인덱스(Unique Index)인덱스의 모든 엔트리가 고유해야 하는 경우
다중 키 인덱스(Multikey Index)인덱스 키로 사용된 필드의 값이 배열인 경우
공간 정보 인덱스좌표 평면으로 적용된다. 다양한 이유로 사용


고유 인덱스(Unique Index)

인덱스의 모든 엔트리가 고유해야 하는 경우 Mongo에서 기본적으로 가지고 있는 _id 또한 고유 인덱스 이다.

sort()를 활용해서 정렬된 자료를 얻을 수 있다. 1: 오름차순 -1: 내림차순

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
Index: 특정 문서를 탐색 할 때 전부를 탐색하지 않고도 데이터를 찾을 수 있게 한다.
=> 빠르게 데이터를 조회 가능하다.
종류: 고유 인덱스, 다중 키 인덱스, 공간정보 인덱스
*/

//Data설정: user Collection에 id,score field를 가진 30개의 Document 생성
var user ={};
function adduser(){
    for(var i=0;i<30;i++){
    	user.id = i;
    	if(i>0 && i<5 )
    	user.score =3;
    	db.user.insert(user);
    }
}
adduser()

//고유 인덱스(Unique Index): 인덱스의 모든 엔트리가 고유해야 하는 경우
db.user.createIndex({id:1})
/*
sort()를 활용해서 정렬된 자료를 얻을 수 있다.
1: 오름차순
-1: 내림차순
*/
db.user.find().sort({id:1})
db.user.find().sort({id:-1})


결과 - db.user.find().sort({id:1})


결과 - db.user.find().sort({id:-1})


다중키 인덱스(Multikey Index)

인덱스로 사용된 필드의 값이 배열인 경우

1
2
3
4
//다중 키 인덱스(Multikey Index): 인덱스 키로 사용된 필드의 값이 배열인 경우
//id: 오름차순, score: 내림차순으로 최적화한 Index 생성
db.user.createIndex({score:1,id:1})
db.user.find().sort({score:1})

결과


공간정보 인덱스

좌표 평면으로 적용된다. 다양한 이유로 사용된다.

  • Within: 좌표와 Boundary를 지정한 모형을 생성한 후 Boundary안에 있는 Document 찾기
종류모양
$box사각형
$center
$centerSphere


1
2
3
4
5
6
7
8
9
10
11
12
//공간 정보 인덱스 2차원으로 생성
//$geoWithin은 지형 모형을 선택하여 실행하겠다는 의미이다.
//$centerSphere: 구형, $box: 사각형, $center: 원형
db.legacyplaces.find({
  location: {
    $geoWithin: {
      //(x,y)=> Center값 지정후
      //반지름 정하기: radian 을 사용하여 정해지므로 6378.1로 나누었다.
      $centerSphere: [[126.876933, 33.381018], 5 / 6378.1]
    }
  }
})


  • near: 좌표를 지정한 후 가까운 거리 순으로 문서를 찾음
1
2
3
4
5
6
7
8
9
10
11
12
13
//$near: 좌표를 지정한 후 가까운 거리 순으로 문서를 찾는 Option
db.places.find({
  location: {
    $nearSphere: {
      $geometry: {
        type: 'Point',
        coordinates: [ 126.941131, 33.459216 ]
      },
      $minDistance: 1000,
      $maxDistance: 12000
    }
  }
})


  • geoNear aggregation stage: aggregation은 쿼리에 포함이 가능하므로 MongoDb aggregation 파이프라인의 장점을 최대한 이용할 수 있다.

Option

limit가져올 문서의 최대 개수
query문서를 필터링
near기준 좌표점
distanceField거리를 출력 할 필드명


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//$geoNear aggregation stage: 가까운 곳을 찾고 거리까지 구하는 방법
db.places.aggregate([
  {
    $geoNear: {
      spherical: true,
      limit: 10,
      maxDistance: 10000,
      near: {
        type: 'Point',
        coordinates: [126.876933, 33.381018]
      },
      distanceField: 'distance',
      key: 'location'
    }
  }
])

결과 - Within



내용 참조: MongoDB 사이트
내용 참조: Namoosori-MongoDB(ver2.21) PDF
내용 참조: Reid 블로그
참조: 원본코드
코드에 문제가 있거나 궁금한 점이 있으면 wjddyd66@naver.com으로 Mail을 남겨주세요.

Categories:

Updated:

Leave a comment