반응형
개요
위치와 관련된 정보를 저장할 때 보통 위도, 경도를 저장하여 사용한다. 저장된 위도, 경도를 토대로 특정 범위 내에 존재하는 다른 값들을 찾는 경우가 간간히 있다. 예를 들어 현재 내 위치에서 10km 이내에 존재하는 모든 카페를 찾고 싶다고 해보자. 이러한 경우 단순 쿼리를 체이닝하기에는 약간 복잡하게 느껴질 수 있다. MongoDB에서는 이러한 지리, 거리 관련 쿼리를 쉽게 하기 위해 지리 공간적인(Geospatial) 쿼리를 지원한다. 선행 지식은 다음과 같다.
선행지식
GeoJson : Json 형태로 지형에 대한 데이터를 정의하는 포맷이며 형태는 아래와 같다.
<field>: {<type>: <GeoJSON type>, coodinates: <coordinates>}
- type에는 Point, PolyGon, MultiPoint등 여러가지가 존재한다. 본 예제에서는 Point를 대상으로 진행한다.
Geospatial Indexes : 지형 정보에 대한 쿼리를 지원하기 위한 지형 인덱스이며 종류는 아래와 같다.
- 2dsphere : 지구와 같은 구 형태의 지형을 기반으로 계산하는데 사용
- 2d : x, y축의 평면 지형을 기반으로 계산하는데 사용
지형 데이터를 통해 쿼리를 실행하기 위해서는 인덱스 설정이 필수적이다.
실습
먼저 아래의 도큐먼트들을 생성한다.
db.cafe.insert({
"name": "Starbucks",
"location" : {
"type" : "Point",
"coordinates" : [
127.0478308,
37.5237227
]
}
})
db.cafe.insert({
"name": "Cafebene",
"location" : {
"type" : "Point",
"coordinates" : [
127.0460438,
37.5245487
]
},
})
다음으로 인덱스를 생성해줘야한다.
db.cafe.createIndex({"location": "2dsphere"})
이제 특정 지점에서부터 1km이내에 존재하는 카페를 검색해보자. 이런 경우 $near
연산자를 사용하여 쉽게 쿼리할 수 있다. (구형 지형 검색을 원한다면 $nearSphere
를 사용한다)
db.cafe.find ({
location: {
$near: {
$geometry: {
type: "Point" ,
coordinates: [ 127.0478308, 37.5237227 ]
},
$maxDistance: 1000,
$minDistance: 0
}
}
})
(참고로 $maxDistance
의 단위는 미터(m) 이다)
위 쿼리의 결과는 다음과 같다.
{
"_id" : ObjectId("5d35242d4bf8c8dd0e883740"),
"name" : "Starbucks",
"location" : {
"type" : "Point",
"coordinates" : [
127.0478308,
37.5237227
]
}
}
{
"_id" : ObjectId("5d35242d4bf8c8dd0e883741"),
"name" : "Cafebene",
"location" : {
"type" : "Point",
"coordinates" : [
127.0460438,
37.5245487
]
}
}