문서 메뉴

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

지리공간 쿼리

이 페이지의 내용

  • 호환성
  • 지리 공간 데이터
  • 지리 공간적 인덱스
  • 지리공간 쿼리
  • 지리공간 모델
  • Atlas에서 지리 공간적 쿼리 수행
  • 예제

MongoDB는 지리 공간적 데이터에 대한 쿼리 작업을 지원합니다. 이 섹션에서는 MongoDB의 지리 공간적 기능을 소개합니다.

다음 환경에서 호스팅되는 배포에 지리 공간적 쿼리를 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

MongoDB Atlas에서 호스팅되는 배포의 경우 쿼리 Filter 표시줄 또는 애그리게이션 빌더를 사용하여 UI에서 지리 공간적 쿼리를 실행할 수 있습니다. 자세히 알아보려면 Atlas에서 지리 공간적 쿼리 수행을 참조하세요.

MongoDB에서는 지리 공간적 데이터를 GeoJSON 객체 또는 레거시 좌표 쌍으로 저장할 수 있습니다.

지구와 같은 구의 기하학적 모양을 계산하려면 위치 데이터를 GeoJSON 개체로 저장합니다.

GeoJSON 데이터를 지정하려면 포함된 문서를 사용하세요.

  • GeoJSON 객체 유형을 지정하는 type이라는 필드와

  • 객체의 좌표를 지정하는 coordinates라는 필드입니다.

    중요

    위도 및 경도 좌표를 지정하는 경우 경도를 먼저 나열한 다음 위도를 나열합니다.

    • 유효한 경도 값은 -180~180입니다(둘 모두 포함).

    • 유효한 위도 값은 -90~90입니다(둘 모두 포함).

<field>: { type: <GeoJSON type> , coordinates: <coordinates> }

예를 들어 GeoJSON 점을 지정하려면 다음을 수행합니다.

location: {
type: "Point",
coordinates: [-73.856077, 40.848447]
}

MongoDB에서 지원되는 GeoJSON 객체 목록과 예제는 GeoJSON 객체를 참조하세요.

GeoJSON 객체에 대한 MongoDB 지리 공간적 쿼리는 구체에서 계산되며, MongoDB는 GeoJSON 객체에 대한 지리 공간적 쿼리에 WGS84 참고 시스템을 사용합니다.

유클리드 평면에서 거리를 계산하려면 위치 데이터를 2d 레거시 좌표 쌍으로 저장하고 인덱스를 사용합니다. MongoDB는 데이터를 GeoJSON 포인트 유형 으로 수동으로 변환하는 경우 인덱스를 사용하여 레거시 좌표 쌍에 대한 구형 표면 계산을 지원합니다.2dsphere

데이터를 레거시 좌표 쌍으로 지정하려면 배열(선호되는 방법) 또는 포함된 문서를 사용할 수 있습니다.

배열을 통해 지정합니다(기본 설정):
<field>: [ <x>, <y> ]

위도 및 경도 좌표를 지정하는 경우 경도를 먼저 나열한 다음 위도를 나열합니다.

<field>: [<longitude>, <latitude> ]
  • 유효한 경도 값은 -180~180입니다(둘 모두 포함).

  • 유효한 위도 값은 -90~90입니다(둘 모두 포함).

포함된 문서를 통해 지정합니다.
<field>: { <field1>: <x>, <field2>: <y> }

위도 및 경도 좌표를 지정하는 경우 필드 이름에 관계없이 첫 번째 필드에는 경도 값이 포함되고 두 번째 필드에는 위도 값이 포함되어야 합니다. 즉,

<field>: { <field1>: <longitude>, <field2>: <latitude> }
  • 유효한 경도 값은 -180~180입니다(둘 모두 포함).

  • 유효한 위도 값은 -90~90입니다(둘 모두 포함).

일부 언어에서는 연관 맵 순서가 보장되지 않으므로 레거시 좌표 쌍을 지정하려면 포함된 문서보다 배열을 사용하는 것이 좋습니다.

MongoDB는 지리 공간적 쿼리를 지원하기 위해 다음과 같은 지리 공간적 인덱스 유형을 제공합니다.

2dsphere 인덱스 는 지구와 같은 구에서 도형을 계산하는 쿼리를 지원합니다.

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

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

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

참고

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

MongoServerError: Index build failed

2dsphere 인덱스에 대한 자세한 내용은 2dsphere 인덱스를 참조하세요.

2d 인덱스 는 2차원 평면에서 도형 을 계산하는 쿼리를 지원합니다. 인덱스는 구체에서 계산하는 $nearSphere 쿼리를 지원할 수 있지만, 가능하면 구체 쿼리에는 2dsphere 인덱스를 사용합니다.

2d 인덱스를 생성하려면, db.collection.createIndex() 메서드를 사용하여 위치 필드를 키로 지정하고 "2d" 문자열 리터럴을 다음과 같이 인덱스 유형으로 지정합니다.

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

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

2d 인덱스에 대한 자세한 내용은 2d 인덱스를 참조하세요.

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

샤드 collection에서 지원되는 지리 공간적 작업은 다음과 같습니다.

MongoDB 4.0부터 샤드 collection에 대해 $near$nearSphere 쿼리가 지원됩니다.

이전 MongoDB 버전에서는 샤딩된 collection에 대해 $near$nearSphere 쿼리가 지원되지 않습니다. 대신 shard cluster의 경우 $geoNear 애그리게이션 단계 또는 geoNear 명령(MongoDB 4.0 이하에서 사용 가능)을 사용해야 합니다.

$geoWithin$geoIntersects 를 사용하여 샤드 cluster의 지리 공간적 데이터를 쿼리할 수도 있습니다.

지리 공간적 인덱스쿼리를 포함할 수 없습니다.

참고

구형 쿼리의 경우 2dsphere 인덱스 결과를 사용합니다.

구형 쿼리에 2d 인덱스를 사용하면 극점을 감싸는 구형 쿼리에 2d 인덱스를 사용하는 것처럼 잘못된 결과가 발생할 수 있습니다.

MongoDB는 다음과 같은 지리공간 쿼리 연산자를 제공합니다:

이름
설명
$geoIntersects
GeoJSON 기하 도형과 교차하는 기하 도형을 선택합니다. 2dsphere 인덱스는 $geoIntersects지원합니다.
점 근처에 있는 지리 공간적 객체를 반환합니다. 지리 공간적 공간 인덱스가 필요합니다. 2D구2D 인덱스는 $near지원합니다.
구의 점에 근접한 지형 공간 객체를 반환합니다. 지리 공간적 공간 인덱스가 필요합니다. 2D구2D 인덱스는 $nearSphere지원합니다.

예시를 포함한 자세한 내용은 참조 페이지를 참조하세요.

뉴스룸보도 자료 및 뉴스 기사 읽기

단계
설명

지리 공간적 공간 점과의 근접성을 기준으로 정렬된 문서 스트림을 반환합니다. 지리 공간적 공간 데이터에 $match, $sort, $limit 기능을 통합합니다. 출력 문서에는 추가 거리 필드가 포함되며 위치 식별자 필드가 포함될 수 있습니다.

$geoNear 에는 지리 공간적 공간 인덱스가 필요합니다.

예시를 포함한 자세한 내용은 $geoNear 참고 페이지를 참조하세요.

MongoDB 지리공간 쿼리는 평평한 표면이나 구의 기하학적 구조를 해석할 수 있습니다.

2dsphere 인덱스는 구형 쿼리만 지원합니다(예: 구형 표면의 도형을 해석하는 쿼리).

2d 인덱스는 플랫 쿼리를 지원합니다(예 평평한 표면의 기하학을 해석하는 쿼리) 및 일부 구형 쿼리. 2d 색인은 일부 구형 쿼리를 지원하지만 이러한 구면 쿼리에 2d 색인을 사용하면 오류가 발생할 수 있습니다. 가능하면 구형 쿼리에는 2dsphere 인덱스를 사용합니다.

다음 표에는 각 지리 공간적 작업에 사용되는 지리 공간적 쿼리 연산자, 지원되는 쿼리가 나열되어 있습니다.

작업
구형/평면 쿼리
참고 사항
$near (이 줄과 다음 줄의 GeoJSON 중심점, 2dsphere 인덱스)
구형
GeoJSON2dsphere 인덱스와 함께 사용할 때 동일한 기능을 $nearSphere 제공하는 연산자도 참조하세요.
평면
$nearSphere (GeoJSON 포인트, 2dsphere 인덱스)
구형

GeoJSON 포인트 및 2dsphere 인덱스를 사용하는 작업과 $near 동일한 기능을 제공합니다.

구형 쿼리의 경우 연산자보다는 이름에 구형 쿼리를 명시적으로 지정하는 $nearSphere $near를 사용하는 것이 더 나을 수 있습니다.

구형
대신 GeoJSON 점을 사용하세요.
구형
$geoWithin : { $box: ... }
평면
$geoWithin : { $polygon: ... }
평면
$geoWithin : { $center: ... }
평면
구형
구형
$geoNear 애그리게이션 단계(2dsphere 인덱스)
구형
$geoNear 애그리게이션 단계(2d 인덱스)
평면

다음 문서를 사용하여 컬렉션 places를 생성합니다.

db.places.insertMany( [
{
name: "Central Park",
location: { type: "Point", coordinates: [ -73.97, 40.77 ] },
category: "Parks"
},
{
name: "Sara D. Roosevelt Park",
location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] },
category: "Parks"
},
{
name: "Polo Grounds",
location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] },
category: "Stadiums"
}
] )

다음 작업은 location 필드에 2dsphere 인덱스를 생성합니다:

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

위의 places 컬렉션에는 2dsphere 인덱스가 있습니다. 다음 쿼리는 지정된 GeoJSON 점에서 최소 1,000미터에서 최대 5,000미터 떨어진 문서를 $near 연산자를 사용하여 가장 가까운 것부터 가장 먼 것 순으로 정렬하여 반환합니다.

db.places.find(
{
location:
{ $near:
{
$geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
$minDistance: 1000,
$maxDistance: 5000
}
}
}
)

다음 작업은 $geoNear 집계 연산을 사용하여 쿼리 필터 { category: "Parks" }과 일치하는 문서를 지정된 GeoJSON 점에서 가장 가까운 순서에서 가장 먼 순서로 정렬하여 반환합니다:

db.places.aggregate( [
{
$geoNear: {
near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
spherical: true,
query: { category: "Parks" },
distanceField: "calcDistance"
}
}
] )
← 텍스트 검색 언어