2D 인덱스 내부
이 문서 에서는 2d 인덱스 의 내부를 설명합니다. 이 자료는 정상적인 운영이나 애플리케이션 개발 에는 필요하지 않지만 문제 해결 및 추가 이해에는 유용할 수 있습니다.
Geohash 값
legacy coordinate pairs 가 포함된 필드에 지리 공간적 인덱스를 생성하면 MongoDB는 지정된 위치 범위 내의 좌표 쌍에 대한 geohash 값을 계산한 다음 geohash 값을 인덱싱합니다.
geohash 값을 계산하기 위해 MongoDB는 2차원 지도를 사분면으로 재귀적으로 나눕니다. 그런 다음 각 사분면에 2비트 값을 할당합니다. 예를 들어 4개의 사분면을 2비트로 표현하면 다음과 같습니다.
01 11 00 10
이러한 2비트 값(00
, 01
, 10
및 11
)은 각 사분면과 각 사분면 내의 모든 점을 나타냅니다. 각 사분면에는 해당 geohash 값이 있습니다.
사분면 | geohash |
---|---|
왼쪽 하단 | 00 |
왼쪽 상단 | 01 |
오른쪽 하단 | 10 |
오른쪽 상단 | 11 |
추가 정밀도를 제공하기 위해 MongoDB는 각 사분면을 하위 사분면으로 나눌 수 있습니다. 각 하위 사분면에는 하위 사분면의 값과 연결된 포함 사분면의 geohash 값이 있습니다. 예를 들어 오른쪽 상단 사분면에 대한 geohash는 11
이고 하위 사분면에 대한 geohash는 (좌측 상단에서 시계 방향):
1101
1111
1110
1100
2D 인덱스를 위한 다중 위치 문서
2D 인덱스는 문서에서 둘 이상의 위치 필드를 지원하지 않지만, 다중 키 인덱스 를 사용하여 단일 문서에서 여러 좌표 쌍을 인덱스할 수 있습니다. 예를 들어 다음 문서에서 locs
필드에는 좌표 쌍의 배열이 있습니다.
db.places.insertOne( { locs : [ [ 55.5 , 42.3 ], [ -74 , 44.74 ], { long : 55.5 , lat : 42.3 } ] } )
locs
배열의 값은 다음 중 하나일 수 있습니다.
배열(예:
[ 55.5, 42.3 ]
.내장된 문서(예:
{ long : 55.5 , lat : 42.3 }
.
locs
배열의 모든 좌표 쌍을 인덱스하려면 locs
필드에 2D 인덱스를 만듭니다.
db.places.createIndex( { "locs": "2d" } )
내장된 다중 위치 문서
위치 데이터를 내장된 문서 내부의 필드로 저장할 수 있습니다. 예를 들어, 각 내장된 문서에 위치 데이터가 포함된 필드가 있는 내장된 문서 배열이 있을 수 있습니다.
다음 문서에서 addresses
필드는 내장된 문서의 배열입니다. 내장된 문서에는 좌표 쌍인 loc
필드가 포함되어 있습니다.
db.records.insertOne( { name : "John Smith", addresses : [ { context : "home" , loc : [ 55.5, 42.3 ] }, { context : "work", loc : [ -74 , 44.74 ] } ] } )
addresses
배열의 모든 loc
값을 인덱스하려면 addresses.loc
필드에 2D 인덱스를 만듭니다.
db.records.createIndex( { "addresses.loc": "2d" } )