문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/

지리공간 쿼리

이 페이지의 내용

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

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

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

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

  • MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전

  • MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전

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

MongoDB에서는 지리공간 데이터를 GeoJSON 객체 또는 legacy coordinate pairs로 저장할 수 있습니다.

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

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

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

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

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

중요

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

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

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

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

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

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

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

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

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

배열을 통해 지정합니다(기본 설정):
<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 인덱스를 참조하세요.

참고

구형 데이터에 대한 쿼리에 2d 인덱스를 사용하면 잘못된 결과 또는 오류가 반환될 수 있습니다. 예를 들어, 2d 인덱스는 극점을 감싸는 구형 쿼리를 지원하지 않습니다.

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

이름
설명
$geoIntersects
GeoJSON 도형과 교차하는 도형을 선택합니다. 2dsphere 인덱스는 $geoIntersects를 지원합니다.
점 근처에 있는 지리 공간적 객체를 반환합니다. 지리 공간적 공간 인덱스가 필요합니다. 2dsphere2d 인덱스는 $near를 지원합니다.
구의 점에 근접한 지리 공간적 객체를 반환합니다. 지리 공간적 공간 인덱스가 필요합니다. 2dsphere2d 인덱스는 $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"
}
}
] )
← 텍스트 검색 언어