AI 에이전트의 경우: 문서 인덱스는 https://www.mongodb.com/ko-kr/docs/llms.txt에서 사용할 수 있으며, 모든 페이지의 마크다운 버전은 어떤 URL 경로에 .md를 추가하여 사용할 수 있습니다.
Docs Menu

지리공간 쿼리

이 가이드 에서는 스칼라 운전자 사용하여 지리 공간적 데이터를 쿼리 방법을 학습 수 있습니다. 또한 MongoDB 에서 지원하는 다양한 지리 공간적 데이터 형식에 대해서도 학습 수 있습니다.

지리 공간적 데이터는 지구 표면의 지리적 위치 나타냅니다. 지리 공간적 데이터의 예는 다음과 같습니다.

  • 영화관 위치

  • 국가 경계

  • 자전거 라이딩 경로

  • 뉴욕의 반려견 운동 공간

theaters sample_mflix 이 가이드 의 예제에서는 Atlas 샘플 데이터 세트의 데이터베이스 에 있는 컬렉션 사용합니다. 스칼라 애플리케이션 에서 이 컬렉션 액세스 하려면 Atlas cluster 에 연결하는 MongoClient 를 만들고 databasecollection 변수에 다음 값을 할당합니다.

val database: MongoDatabase = mongoClient.getDatabase("sample_mflix")
val collection: MongoCollection[Document] = database.getCollection("theaters")

무료 MongoDB Atlas 클러스터 생성하고 샘플 데이터 세트를 로드하는 방법을 학습하려면 MongoDB 시작하기 가이드 를 참조하세요.

지리 공간적 데이터를 MongoDB에 저장하고 쿼리하려면 GeoJSON 을 사용합니다. GeoJSON은 IETF(인터넷 엔지니어링 태스크포스)에서 개발한 데이터 형식입니다.

GeoJSON 내 MongoDB 본사의 위치는 다음과 같습니다.

"location" : {
"type": "Point",
"coordinates": [-73.986805, 40.7620853]
}

GeoJSON 에 대한 자세한 내용은 공식 IETF 사양을참조하세요.

위치는 지구상의 한 장소를 나타내며 두 개 또는 세 개의 숫자 값을 포함하는 배열 로 제공됩니다.

  • 첫 번째 위치의 경도(필수)

  • 두 번째 위치의 위도(필수)

  • 세 번째 위치의 고도(선택 사항)

중요

경도, 위도 순서

GeoJSON은 좌표를 경도가 먼저, 위도가 두 번째로 정렬합니다. 지리적 좌표계 규칙은 일반적으로 위도를 먼저 나열하고 경도를 나중에 나열하기 때문에 의외일 수 있습니다. 작업 중인 다른 도구가 어떤 형식을 사용하는지 확인하세요. OpenStreetMap 및 Google Maps와 같이 널리 사용되는 도구는 좌표를 위도, 경도 순으로 나열합니다.

GeoJSON 객체의 유형에 따라 기하학적 모양이 결정됩니다. 기하학적 도형은 위치로 구성됩니다.

다음은 몇 가지 일반적인 GeoJSON 유형과 이를 위치로 지정하는 방법입니다:

  • Point: 단일 위치. 이는 조각상의 위치를 나타낼 수 있습니다.

  • LineString: 두 개 이상의 위치로 구성된 배열로, 일련의 라인 세그먼트를 형성합니다. 이는 만리장성의 경로를 나타낼 수 있습니다.

  • Polygon: 일부 공간을 둘러싸는 첫 번째 위치와 마지막 위치가 동일한 위치의 배열입니다. 이는 바티칸 시국 내의 땅을 나타낼 수 있습니다.

MongoDB 에서 사용할 수 있는 모양에 대해 자세히 학습하려면 서버 매뉴얼에서 GeoJSON 을 참조하세요.

2dsphere 인덱스를 생성하려면 Indexes.geo2dsphere() 헬퍼를 사용하여 2dsphere 인덱스에 대한 사양을 생성합니다. 인덱스를 생성하려면 MongoCollection.createIndex() 메서드에 사양을 전달합니다.

다음 예에서는 theaters 컬렉션의 "location.geo" 필드에 2dsphere 인덱스를 생성합니다.

val indexObservable = collection.createIndex(Indexes.geo2dsphere("location.geo"))
Await.result(indexObservable.toFuture(), Duration(10, TimeUnit.SECONDS))

스칼라 운전자 의 인덱스에 대해 자세히 학습 인덱스를 사용하여 쿼리 최적화 가이드 를 참조하세요.

2차원 유클리드 평면에서 x 및 좌표를 사용하여 지리 공간적 데이터를 저장 수 y 있습니다. 2차원 평면의 좌표를 레거시 좌표 쌍 이라고 합니다.

legacy coordinate pairs의 구조는 다음과 같습니다.

{ "location" : [ x, y ] }

필드 값에는 첫 번째 값이 x 축 값을 나타내고 두 번째 값이 y 축 값을 나타내는 두 값의 배열 포함합니다.

레거시 좌표 쌍 으로 저장된 데이터를 쿼리 하려면 레거시 좌표 쌍 포함된 필드 2d 인덱스 에 추가해야 합니다. 다음 스니펫은 Indexes 객체 사용하여 coordinates 필드 에 2d 인덱스 생성합니다.

val indexObservable = collection.createIndex(Indexes.geo2d("coordinates"))
Await.result(indexObservable.toFuture(), Duration(10, TimeUnit.SECONDS))

스칼라 운전자 의 인덱스에 대해 자세히 학습 인덱스를 사용하여 쿼리 최적화 가이드 를 참조하세요.

레거시 좌표 쌍에 대한 자세한 내용은 서버 매뉴얼에서 지리 공간적 쿼리 가이드의 레거시 좌표 쌍 섹션을 참조하세요.

지원되는 연산자

구형(2dsphere) 및 평면(2d) 인덱스는 일부 동일한 쿼리 연산자를 지원 하지만, 지원하는 쿼리 연산자가 모두 동일하지는 않습니다. 연산자 전체 목록과 인덱스 호환성을 보려면 서버 매뉴얼의 지리 공간적 쿼리 가이드에서 지리 공간적 쿼리 연산자 섹션을 참조하세요.

지리 공간적 쿼리는 쿼리 연산자와 쿼리 매개변수인 GeoJSON 도형으로 구성됩니다.

지리 공간적 데이터를 쿼리하려면 다음 쿼리 연산자 중 하나를 사용합니다:

  • $near

  • $geoWithin

  • $nearSphere

  • $geoIntersects 2dsphere 인덱스 필요

스칼라 운전자 에서 Filters 객체 의 near(), geoWithin(), nearSphere()geoIntersects() 메서드를 사용하여 이러한 쿼리 연산자를 지정할 수 있습니다.

지리 공간적 쿼리 연산자에 대해 자세히 학습하려면 서버 매뉴얼의 지리 공간적 쿼리 가이드의 지리 공간적 쿼리 연산자 섹션을 참조하세요.

Filters 헬퍼 메서드의 전체 목록을 보려면 필터 API 설명서를 참조하세요.

지리 공간적 쿼리 에서 사용할 도형을 지정하려면 스칼라 운전자 의 Position, Point, LineString, Polygon 클래스를 사용합니다.

GeoJSON 모양 클래스에 대해 자세히 학습하려면 GeoJSON 패키지 API 설명서를 참조하세요.

다음 예제에서는 샘플 데이터베이스 의 MongoDB Atlas 컬렉션 theaters sample_mflix 사용합니다. 무료 계층 Atlas cluster 설정하다 방법과 샘플 데이터 세트를 로드하는 방법은 스칼라 드라이버 시작하기 가이드 에서 학습 수 있습니다.

이 섹션의 예제에는 다음과 같은 가져오기가 필요합니다.

import org.mongodb.scala.*
import org.mongodb.scala.model.Indexes
import org.mongodb.scala.model.Filters
import org.mongodb.scala.model.Projections
import com.mongodb.client.model.geojson.{Point, Polygon, Position}
import java.util.Arrays
import java.util.concurrent.TimeUnit
import scala.concurrent.Await
import scala.concurrent.duration.Duration

theaters collection에는 location.geo 필드에 2dsphere 인덱스가 이미 포함되어 있습니다.

점 에서 가장 가까운 것부터 가장 먼 것 순으로 문서를 검색 하고 반환하려면 Filters 객체 의 near() 메서드를 사용합니다. near() 메서드는 $near 쿼리 연산자 사용하여 쿼리 구성합니다.

다음 예시 지정된 GeoJSON Point 인스턴스 에서 최대 1000 미터 떨어진 문서를 가장 가까운 것부터 가장 먼 것 순으로 정렬하여 반환합니다.

val refPoint = new Point(new Position(-73.986805, 40.7620853))
val findObservable = collection.find(Filters.near("location.geo", refPoint, Some(1000.0), Some(0.0)))
val results = Await.result(findObservable.toFuture(), Duration(10, TimeUnit.SECONDS))
{"_id": {"$oid": "59a47287cfa9a3a73e51e8e2"}, "theaterId": 1908, "location":
{"address": {"street1": "750 Seventh Ave", "city": "New York", "state": "NY",
"zipcode": "10019"}, "geo": {"type": "Point", "coordinates": [-73.983487, 40.76078]}}}
{"_id": {"$oid": "59a47286cfa9a3a73e51e838"}, "theaterId": 1448, "location":
{"address": {"street1": "1880 Broadway", "city": "New York", "state": "NY",
"zipcode": "10023"}, "geo": {"type": "Point", "coordinates": [-73.982094, 40.769882]}}}

MongoDB는 GPS 인공위성 과 동일한 참조 시스템 을 사용하여 지구의 기하학을 계산합니다.

$near 연산자에 대해 자세히 학습하려면 서버 매뉴얼에서 $near 참조를 참조하세요.

지정된 도형 내에서 지리 공간적 데이터를 검색 하려면 Filters 객체 의 geoWithin() 메서드를 사용합니다. geoWithin() 메서드는 $geoWithin 쿼리 연산자 사용하여 쿼리 구성합니다.

다음 예시 롱 아일랜드의 한 구역에 있는 영화관을 검색합니다. 이 예시 각 결과에 location.address.city 필드 만 포함하고 _id 필드 제외하도록 프로젝션 적용합니다.

val longIslandTriangle = new Polygon(Arrays.asList(
new Position(-72.0, 40.0),
new Position(-74.0, 41.0),
new Position(-72.0, 39.0),
new Position(-72.0, 40.0)
))
val projection = Projections.fields(
Projections.include("location.address.city"),
Projections.excludeId()
)
val geoWithinComparison = Filters.geoWithin("location.geo", longIslandTriangle)
val findObservable = collection.find(geoWithinComparison).projection(projection)
val results = Await.result(findObservable.toFuture(), Duration(10, TimeUnit.SECONDS))
results.foreach(doc => println(doc.toJson()))
{"location": {"address": {"city": "Baldwin"}}}
{"location": {"address": {"city": "Levittown"}}}
{"location": {"address": {"city": "Westbury"}}}
{"location": {"address": {"city": "Mount Vernon"}}}
{"location": {"address": {"city": "Massapequa"}}}

다음 그림은 longIslandTriangle 변수로 정의된 다각형 과 쿼리 반환하는 영화관의 위치를 나타내는 점을 보여줍니다.

영화관을 검색 할 수 있는 롱 아일랜드 지역

$geoWithin 연산자에 대해 자세히 학습하려면 서버 매뉴얼에서 $geoWithin 참조를 참조하세요.

지리 공간적 쿼리 수행에 학습 보려면 서버 매뉴얼의 지리 공간적 쿼리를 참조하세요.