문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

2dsphere 인덱스

이 페이지의 내용

  • 개요
  • 버전
  • 고려 사항
  • 2dsphere 인덱스 만들기

2dsphere 인덱스는 지구와 같은 구체에서 도형을 계산하는 쿼리를 지원합니다. 2dsphere 인덱스는 포함, 교차 및 근접에 대한 쿼리 등 모든 MongoDB 지리 공간적 쿼리를 지원합니다. 지리 공간적 쿼리에 대한 자세한 내용은 지리 공간적 쿼리를 참조하세요 .

2dsphere 인덱스는 GeoJSON 객체 레거시 좌표 쌍 으로 저장된 데이터를 지원합니다( 2dsphere 인덱스 필드 제한 참조). 레거시 좌표 쌍의 경우 인덱스는 데이터를 GeoJSON Point 로 변환합니다.

2dsphere 인덱스 버전
설명
버전 3
MongoDB 3.2에는 2dsphere 인덱스의 버전 3이 도입되었습니다. 버전 3은 MongoDB 3.2 이상에서 생성된 2dsphere 인덱스의 기본 버전입니다.
버전 2
MongoDB 2.6에는 2dsphere 인덱스의 버전 2가 도입되었습니다. 버전 2는 MongoDB 2.6 및 3.0 시리즈에서 생성된 2dsphere 인덱스의 기본 버전입니다.

기본 버전을 재정의하고 다른 버전을 지정하려면 인덱스를 생성할 때 { "2dsphereIndexVersion": <version> } 옵션을 포함합니다.

버전 2 이상 2dsphere 인덱스는 항상 sparse 하며 sparse 옵션을 무시합니다. 문서에 2dsphere 인덱스 필드가 없는 경우(또는 필드가 null 또는 빈 배열인 경우) MongoDB는 문서에 대한 항목을 인덱스에 추가하지 않습니다. 삽입의 경우 MongoDB는 문서를 삽입하지만 2dsphere 인덱스에 추가하지는 않습니다.

다른 유형의 키와 함께 2dsphere 인덱스 키를 포함하는 복합 인덱스의 경우, 2dsphere 필드만이 인덱스가 문서를 참고하는지 여부를 결정합니다.

이전 버전의 MongoDB는 2dsphere (Version 1) 인덱스만 지원합니다. 2dsphere (Version 1) 인덱스는 기본적으로 희박 하지 않으며 null 위치 필드가 있는 문서를 거부합니다.

버전 2 이상 2dsphere 인덱스에는 추가 GeoJSON 객체 MultiPoint, MultiLineString, MultiPolygonGeometryCollection 에 대한 지원이 포함됩니다. 지원되는 모든 GeoJSON 객체에 대한 자세한 내용은 GeoJSON 객체를 참조하세요 .

MongoDB 4.0부터는 $geoNear 파이프라인 단계에 key 옵션을 지정하여 사용할 인덱싱된 필드 경로를 나타낼 수 있습니다. 이렇게 하면 여러 개의 2dsphere 인덱스 및/또는 여러 개의 2D 인덱스가 있는 컬렉션에서$geoNear단계를 사용할 수 있습니다.

  • collection에 여러 개의 2dsphere 인덱스 및/또는 여러 2D 인덱스가 있는 경우 key 옵션을 사용하여 사용할 인덱싱된 필드 경로를 지정해야 합니다.

  • key 을 지정하지 않으면 key 이 없으면 여러 2d 인덱스 또는 2dsphere 인덱스 중에서 인덱스를 선택하는 것이 모호하므로 여러 개의 2dsphere 인덱스 및 여러 개의 2D 인덱스를 가질 수 없습니다.

참고

key 을 지정하지 않고 최대 하나의 2dsphere 인덱스 및 하나의 2D 인덱스만 있는 경우 MongoDB는 먼저 사용할 2d 인덱스를 찾습니다. 2d 인덱스가 없으면 MongoDB는 사용할 2dsphere 인덱스를 찾습니다.

collection을 샤딩할 때는 2dsphere 인덱스를 샤드 키로 사용할 수 없습니다. 그러나 다른 필드를 샤드 키로 사용하여 샤드 collection에 지리 공간적 인덱스를 생성할 수 있습니다.

2dsphere 인덱스가 있는 필드는 좌표 쌍 또는 GeoJSON 데이터 형태의 도형 데이터를 보유해야 합니다. 도형이 아닌 데이터가 있는 문서를 2dsphere 인덱스 필드에 삽입하거나 인덱스 필드에 도형이 아닌 데이터가 있는 컬렉션에 2dsphere 인덱스를 빌드하려고 하면 작업이 실패합니다.

2dsphere 인덱스에 대한 키를 생성하기 위해 mongodGeoJSON 도형을 내부 표현에 매핑합니다. 결과적인 내부 표현은 큰 값 배열일 수 있습니다.

mongod가 배열을 포함하는 필드에 인덱스 키를 생성하면 mongod은 각 배열 요소에 대한 인덱스 키를 생성합니다. 복합 인덱스의 경우, mongod은 각 필드에 대해 생성된 키 세트의 데카르트 곱 을 계산합니다. 두 세트가 모두 큰 경우 데카르트 곱을 계산하면 작업이 메모리 제한을 초과할 수 있습니다.

indexMaxNumGeneratedKeysPerDocument는 메모리 부족 오류를 방지하기 위해 단일 문서에 대해 생성되는 최대 키 수를 제한합니다. 기본값은 문서당 100,000개의 인덱스 키입니다. 제한을 올릴 수는 있지만 indexMaxNumGeneratedKeysPerDocument 매개 변수가 지정한 것보다 더 많은 키가 필요한 경우 작업이 실패합니다.

2dsphere 인덱스를 만들려면 db.collection.createIndex() 메서드를 사용하고 문자열 리터럴 "2dsphere"를 인덱스 형식으로 지정합니다.

db.collection.createIndex( { <location field> : "2dsphere" } )

여기서 <location field> 은 값이 GeoJSON 객체 또는 레거시 좌표 쌍인 필드입니다.

참고

geoJSON 점 배열이 포함된 필드에 인덱스를 만들려고 하면 인덱스 빌드가 실패하고 다음 오류가 반환됩니다.

MongoServerError: Index build failed

하나의 위치 필드와 하나의 다른 필드를 참고할 수 있는 복합 2D 인덱스와 달리, 복합 2dsphere 인덱스는 여러 위치 및 비위치 필드를 참고할 수 있습니다.

다음 예제에서는 loc 이라는 필드에 위치 데이터를 GeoJSON 점 로 저장하는 문서가 있는 collection places 을 고려합니다.

db.places.insertMany( [
{
loc : { type: "Point", coordinates: [ -73.97, 40.77 ] },
name: "Central Park",
category : "Parks"
},
{
loc : { type: "Point", coordinates: [ -73.88, 40.78 ] },
name: "La Guardia Airport",
category : "Airport"
}
] )

다음 작업은 위치 필드 loc2dsphere 인덱스를 생성합니다.

db.places.createIndex( { loc : "2dsphere" } )

복합 인덱스 에는 2dsphere 인덱스 키와 비지리 공간적 인덱스 키가 함께 포함될 수 있습니다. 예를 들어, 다음 작업은 첫 번째 키 loc2dsphere 인덱스 키이고 나머지 키 categorynames 가 비지리 공간적 인덱스 키, 특히 내림차순(-1)인 복합 인덱스를 생성합니다. 및 오름차순(1) 키를 사용합니다.

db.places.createIndex( { loc : "2dsphere" , category : -1, name: 1 } )

2D 인덱스와 달리 복합 2dsphere 인덱스는 위치 필드가 첫 번째로 인덱싱되는 필드일 필요가 없습니다. 예를 들면 다음과 같습니다.

db.places.createIndex( { category : 1 , loc : "2dsphere" } )
← 와일드카드 인덱스 제한