본문 바로가기
카테고리 없음

MongoDB 위치 기반 쿼리(Geospatial)

by Hide­ 2019. 7. 22.
반응형

개요

위치와 관련된 정보를 저장할 때 보통 위도, 경도를 저장하여 사용한다. 저장된 위도, 경도를 토대로 특정 범위 내에 존재하는 다른 값들을 찾는 경우가 간간히 있다. 예를 들어 현재 내 위치에서 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
        ]
    }
}