본문 바로가기

Database/mongoDB

$geoWithin

※ MongoDB 공식 매뉴얼에 나와있는 $geoWithin 부분을 번역해 보도록 하겠습니다. 번역을 안하는게 나을 것 같은 용어들은 한번만 번역하거나 그대로 두었습니다.

Definition (정의)

$geoWithin

 

지정한 모양내에 완전히 존재하는 geospatial data 가 있는 documents 를 선택합니다.

 

지정한 모양은 GeoJSON Polygon (단일 링 또는 다중 링), GeoJSON MultiPolygon 이거나 레거시 좌표 쌍으로 정의된 모양일 수 있습니다. $geoWithin 연산자는 GeoJSON 객체를 지정하기 위해 $geometry 연산자를 사용합니다.

 

GeoJSON polygons 또는 multipolygons 을 지정하기 위해선 기본 좌표 참조 시스템 (CRS) 를 사용해야 하는데, 문법은 다음과 같습니다 :

 

{
   <location field>: {
      $geoWithin: {
         $geometry: {
            type: <"Polygon" or "MultiPolygon"> ,
            coordinates: [ <coordinates> ]
         }
      }
   }
}

 

단일 반구보다 큰 영역을 가진 GeoJSON geometries 를 지정하는 $geoWithin 쿼리에 기본 CRS 를 사용하면 상호 보완적인 geometries 에 대한 쿼리가 생성됩니다.

커스텀 MongoDB CRS 와 함께 단일 링 GeoJSON polygon 을 지정하려면, $geometry 표현식 안에서 커스텀 MongoDB CRS 를 명시하는 다음과 같은 프로토타입을 사용하세요 :

 

{
   <location field>: {
      $geoWithin: {
         $geometry: {
           type: "Polygon" ,
           coordinates: [ <coordinates> ],
           crs: {
              type: "name",
              properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" }
           }
         }
      }
   }
}

 

커스텀 MongoDB CRS 는 시계 반대 방향으로 감는 순서를 사용하며, $geoWithin 은 단일 반구보다 같거나 큰 영역을 가진 단일 링 GeoJSON polygon 과 함께 쿼리를 지원할 수 있습니다. 만약 지정한 polygon 이 단일 반구보다 작다면, MongoDB CRS 와 같이 사용한 $geoWithin 동작은 default CRS 를 사용한 것과 같습니다. "Big" Polygons 를 참고하세요.

 

만약 레거시 좌표쌍으로 정의된 평면상의 모양을 포함하는 쿼리라면, 다음의 문법을 사용하세요 :

 

{
   <location field>: {
      $geoWithin: { <shape operator>: <coordinates> }
   }
}

 

사용 가능한 형태 연산자 :

중요

경도와 좌표를 사용한다면, 경도 - 위도 순서로 명시해야 합니다.

Behavior (동작)

Geospatial Indexes

 

$geoWithin 은 geospatial index 를 필요로 하지 않습니다. 다만, geospatial index 는 쿼리 성능을 향상시킬 것 입니다.

2dsphere 과 2d geospatial index 둘 다 $geoWithin 을 지원합니다.

Unsorted Results (정렬되지 않은 결과)

$geoWithin 연산자는 정렬된 결과를 반환하지 않습니다. 따라서 MongoDB 는 geospatial $near 또는 $nearSphere 쿼리보다 더 빨리 $geoWithin 쿼리를 반환하여 결과를 정렬할 수 있습니다.

Degenerate Geometry (악화된 geometry)

$geoWithin 은 하나의 geometry 가 component geometry 또는 그것을 공유하는 다른 polygon 을 포함한다고 보장하지 않습니다.

“Big” Polygons

$geoWithin 에서, 단일 반구보다 더 큰 영역을 가진 단일 링 polygon 을 지정하려면, $geometry 표현식 안에 커스텀 MongoDB 좌표 참조 시스템을 포함해야 합니다. 그렇지 않으면, $geoWithin 은 상호 보완적인 geometry 에 쿼리할 것입니다. 반구보다 더 큰 영역을 가진 다른 모든 GeoJSON polygons 에 대해 $geoWithin 은 상호 보완적인 geometry 에 쿼리합니다.

Examples

Within a Polygon

다음의 예제는 GeoJSON Polygon 내에 완전히 존재하는 모든 위치 데이터를 선택합니다. polygon 영역은 단일 반구 영역보다 작습니다 :

 

db.places.find(
   {
     loc: {
       $geoWithin: {
          $geometry: {
             type : "Polygon" ,
             coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ]
          }
       }
     }
   }
)

 

단일 반구보다 더 큰 영역을 가진 단일 링 polygons 의 경우, "Big" Polygon 을 참고하세요.

Within a “Big” Polygon

단일 반구보다 더 큰 영역을 가진 단일 링 GeoJSON polygon 에 쿼리하는 경우, $geometry 표현식은 반드시 커스텀 MongoDB 좌표 참조 시스템을 명시해야 합니다. 예제는 다음과 같습니다 :

 

db.places.find(
   {
     loc: {
       $geoWithin: {
          $geometry: {
             type : "Polygon" ,
             coordinates: [
               [
                 [ -100, 60 ], [ -100, 0 ], [ -100, -60 ], [ 100, -60 ], [ 100, 60 ], [ -100, 60 ]
               ]
             ],
             crs: {
                type: "name",
                properties: { name: "urn:x-mongodb:crs:strictwinding:EPSG:4326" }
             }
          }
       }
     }
   }
)

 

$within

version 2.4 이후로 사용되지 않습니다. MongoDB 2.4 버전부터 $geoWithin 이 $within 을 대체합니다.

 

 

출처 : https://docs.mongodb.com/manual/reference/operator/query/geoWithin/#op._S_within

 

$geoWithin — MongoDB Manual

 

docs.mongodb.com

 

'Database > mongoDB' 카테고리의 다른 글

$nearSphere  (0) 2020.04.09
$near  (0) 2020.04.05
$geoIntersects  (0) 2020.03.25
Geospatial Query Operators (Geospatial 쿼리 연산자)  (0) 2020.03.25
GeoJSON Objects (GeoJSON 객체)  (0) 2020.03.18