지리공간 데이터로 작업
개요
이 가이드에서는 지리 공간적 데이터로 작업하는 방법, 데이터 형식, 인덱스 및 쿼리에 대해 알아볼 수 있습니다. 지리 공간적 데이터는 지구 표면의 지리적 위치 또는 유클리드 평면의 데이터를 나타냅니다.
지리 공간적 데이터의 예시는 다음과 같습니다:
영화관 위치
국가 경계
자전거 라이딩 경로
뉴욕의 반려견 운동 공간
그래프의 포인트
지리 공간적 데이터 저장
MongoDB의 모든 지리 공간적 데이터는 다음 형식 중 하나로 저장됩니다:
GeoJSON은 지구와 같은 구체에 지리 공간적 데이터를 나타내는 형식입니다.
레거시 좌표 쌍은 유클리드 평면에서 지리 공간적 데이터를 나타내는 형식입니다.
GeoJSON
지구와 같은 구체에 지리 공간적 정보를 나타내는 데이터를 저장하려면 GeoJSON을 사용합니다. GeoJSON은 하나 이상의 위치와 유형으로 구성됩니다.
위치
위치는 지구상의 단일 장소를 나타내며 코드에 다음 값을 포함하는 배열로 존재합니다.
첫 번째 위치의 경도(필수)
두 번째 위치의 위도(필수)
세 번째 위치의 고도(선택 사항)
다음은 뉴욕에 있는 MongoDB 본사의 위치 입니다.
[]float64{-73.986805, 40.7620853}
중요
경도, 위도 순서
GeoJSON은 좌표를 경도를 첫 번째, 위도를 두 번째 순서로 정렬합니다. 지리적 좌표계 규칙은 일반적으로 위도를 먼저 나열하고 경도를 나중에 나열하기 때문에 의외일 수 있습니다. 작업 중인 다른 도구가 어떤 형식을 사용하는지 확인하세요. OpenStreetMap 및 Google Maps와 같이 널리 사용되는 도구는 좌표를 위도, 경도 순으로 나열합니다.
유형
GeoJSON 객체의 유형에 따라 객체가 나타내는 기하학적 모양이 결정됩니다. 기하학적 도형은 위치로 구성됩니다.
다음은 몇 가지 일반적인 GeoJSON 유형과 이를 위치로 지정하는 방법입니다:
Point
: 단일 위치입니다. 다음Point
는 MongoDB 본사의 위치를 나타냅니다.bson.D{ {"name", "MongoDB HQ"}, {"location", bson.D{ {"type", "Point"}, {"coordinates", []float64{-73.986805, 40.7620853}}, }}, } LineString
: 일련의 라인 세그먼트를 형성하는 두 개 이상의 위치 배열입니다.LineString
은 경로, 루트, 경계, 기타 선형 지리 공간적 데이터를 나타낼 수 있습니다. 다음LineString
은 만리장성의 한 부분을 나타냅니다.bson.D{ {"name", "Great Wall of China"}, {"location", bson.D{ {"type", "LineString"}, {"coordinates", [][]float64{ {116.572, 40.430}, {116.570, 40.434}, {116.567, 40.436}, {116.566, 40.441}, }}}, }, } Polygon
: 첫 번째 위치와 마지막 위치가 동일하고 일부 공간을 둘러싸는 위치 배열입니다. 다음Polygon
은 바티칸 시국 내 땅을 나타냅니다.bson.D{ {"name", "Vatican City"}, {"location", bson.D{ {"type", "Polygon"}, {"coordinates", [][][]float64{{ {12.446086, 41.901977}, {12.457952, 41.901559}, {12.455375, 41.907351}, {12.449863, 41.905186}, {12.446086, 41.901977}, }}}, }}, }
MongoDB에서 사용할 수 있는 GeoJSON 유형에 대한 자세한 내용은 GeoJSON 수동 항목을 참조하세요.
GeoJSON에 대한 자세한 내용은 공식 IETF 사양을 참조하세요.
레거시 좌표 쌍
레거시 좌표 쌍을 사용하여 2차원 유클리드 평면에 지리 공간적 정보를 나타내는 데이터를 저장합니다.
필드는 첫 번째 값이 x
축 값을 나타내고 두 번째 값이 y
축 값을 나타내는 두 값의 배열을 포함해야 합니다.
bson.D{{"center", []int16{0, 0}}}
레거시 좌표 쌍에 대한 자세한 내용은 레거시 좌표 쌍에 대한 MongoDB 서버 매뉴얼 페이지를 참조하세요.
지리 공간적 인덱스
지리 공간적 데이터에 대한 쿼리를 활성화하려면 데이터 형식에 해당하는 인덱스를 생성해야 합니다. 다음 인덱스 유형은 지리 공간적 쿼리를 활성화합니다.
2dsphere
GeoJSON 데이터2d
- 레거시 좌표 쌍의 경우
2dsphere
GeoJSON 형식으로 저장된 데이터를 쿼리하려면 type
및 coordinates
가 모두 포함된 필드를 2dsphere
인덱스에 추가합니다. 다음 예시에서는 location
필드에 2dsphere
인덱스를 생성합니다.
indexModel := mongo.IndexModel{ Keys: bson.D{{"location", "2dsphere"}}, } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) }
2d
기존 좌표 쌍으로 저장된 데이터를 쿼리하려면 기존 좌표 쌍이 포함된 필드를 2d
인덱스에 추가해야 합니다. 다음 예시에서는 coordinates
필드에 2d
인덱스를 생성합니다.
indexModel := mongo.IndexModel{ Keys: bson.D{{"location.coordinates", "2d"}}, } name, err := coll.Indexes().CreateOne(context.TODO(), indexModel) if err != nil { panic(err) }
지리공간 쿼리
지리 공간적 쿼리를 수행하려면 필드 이름과 지리 공간적 쿼리 연산자를 사용하여 쿼리 필터를 생성합니다. 특정 지리 공간적 쿼리 연산자에 대한 추가 옵션을 지정하여 반환되는 문서를 제한할 수 있습니다.
아직 생성하지 않은 경우 지리 공간적 쿼리를 활성화하기 전에 지리 공간적 인덱스를 생성해야 합니다.
팁
지원되는 연산자
구형(2dsphere
) 및 평면(2d
) 인덱스는 전부는 아니지만 일부 동일한 쿼리 연산자를 지원합니다. 전체 연산자 목록과 인덱스 호환성은 지리 공간적 쿼리 수동 항목을 참조하세요.
쿼리 연산자
지리 공간적 데이터를 쿼리하려면 다음 쿼리 연산자 중 하나를 사용합니다:
$near
$geoWithin
$nearSphere
$geoIntersects
2dsphere 인덱스 필요
$near
연산자를 사용할 때 다음과 같은 거리 연산자를 지정할 수 있습니다.
$minDistance
$maxDistance
$geoWithin
연산자를 사용할 때 다음과 같은 도형 연산자를 지정할 수 있습니다:
$box
$polygon
$center
$centerSphere
지리 공간적 쿼리 연산자에 대한 자세한 내용은 지리 공간적 쿼리 수동 항목을 참조하세요.
예시
다음 예시에서는 MongoDB Atlas 샘플 데이터 세트를 사용합니다. Atlas로 시작하기 가이드에 따라 샘플 데이터 세트를 MongoDB Atlas의 프리 티어 데이터베이스에 로드하거나 로컬 MongoDB 인스턴스로 샘플 데이터 세트를 가져올 수 있습니다.
이 예에서는 샘플 데이터 집합의 sample_mflix
데이터베이스에 있는 theaters
컬렉션을 사용합니다. 2} 컬렉션에 필드에 theaters
2dsphere
인덱스가 포함되어 location.geo
있습니다.
근접성 기준 쿼리
다음 예시에서는 뉴욕주 뉴욕에 있는 MongoDB 본사에서 1000미터 이내에 있는 location.geo
필드가 있는 문서를 쿼리합니다. 가장 가까운 문서부터 가장 먼 문서까지 반환합니다.
mongoDBHQ := bson.D{{"type", "Point"}, {"coordinates", []float64{-73.986805, 40.7620853}}} filter := bson.D{ {"location.geo", bson.D{ {"$near", bson.D{ {"$geometry", mongoDBHQ}, {"$maxDistance", 1000}, }}, }}, } var places []bson.D output, err := coll.Find(context.TODO(), filter) if err = output.All(context.TODO(), &places); err != nil { panic(err) } for _, place := range places { res, _ := bson.MarshalExtJSON(place, false, false) fmt.Println(string(res)) }
{"_id":{...},"theaterId":1908,"location":{"address":{...},"geo":{"type":"Point","coordinates":[-73.983487,40.76078]}}} {"_id":{...},"theaterId":1448,"location":{"address":{...},"geo":{"type":"Point","coordinates":[-73.982094,40.769882]}}}
범위 내 쿼리
다음 예시에서는 뉴욕에 있는 MongoDB 본사에서 2000m 이상 떨어져 있으나 3000m 이하로 거리가 있는 location.geo
필드를 포함하는 문서를 쿼리합니다. 가장 가까운 항목에서 가장 먼 항목 순서로 문서를 반환합니다.
mongoDBHQ := bson.D{{"type", "Point"}, {"coordinates", []float64{-73.986805, 40.7620853}}} filter := bson.D{ {"location.geo", bson.D{ {"$nearSphere", bson.D{ {"$geometry", mongoDBHQ}, {"$minDistance", 2000}, {"$maxDistance", 3000}, }}, }}, } var places []bson.D output, err := coll.Find(context.TODO(), filter) if err = output.All(context.TODO(), &places); err != nil { panic(err) } for _, place := range places { res, _ := bson.MarshalExtJSON(place, false, false) fmt.Println(string(res)) }
{"_id":{...},"theaterId":482,"location":{...},"geo":{"type":"Point","coordinates":[-73.99295,40.74194]}}}
추가 리소스
지리 공간적 데이터 작업에 대한 자세한 내용은 지리 공간적 데이터 수동 입력 문서를 참조하세요.
지원되는 GeoJSON 유형에 대한 자세한 내용은 GeoJSON 수동 항목을 참조하세요.
지리 공간적 쿼리 연산자에 대한 자세한 내용은 지리 공간적 쿼리 수동 항목 문서를 참조하세요.
고 (Go) 운전자 를 사용한 인덱스 작업에 대한 자세한 내용은 인덱스 가이드 를 참조하세요.