본문 바로가기

Database/mongoDB

$nearSphere

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

 

Definition (정의)

$nearSphere

 

geospatial query 가 가장 가까운 곳에서 먼 곳 까지의 documents 를 반환하는 point 를 지정합니다. MongoDB 는 구형 geometry 를 사용해서 $nearSphere 쿼리의 거리를 계산합니다.

 

$nearSphere 은 geospatial index 를 필요로 합니다.

 

  • 2dsphere index : GeoJSON point 로 정의된 위치 데이터용
  • 2d index : 레거시 좌표 쌍으로 정의된 위치 데이터용. GeoJSON point 에서 2d index 를 사용하려면, GeoJSON object 의 좌표 필드에 인덱스를 만들어야 합니다.

$nearSphere 연산자는 GeoJSON point 또는 레거시 좌표 point 를 지정할 수 있습니다.

GeoJSON point 를 지정하려면, 다음의 문법을 사용하세요 :

 

{
  $nearSphere: {
     $geometry: {
        type : "Point",
        coordinates : [ <longitude>, <latitude> ]
     },
     $minDistance: <distance in meters>,
     $maxDistance: <distance in meters>
  }
}

 

  • 옵션으로 $minDistance 를 사용하면 중심점으로부터 적어도 지정한 거리만큼은 떨어진 documents 를 반환하도록 제한합니다.
  • $maxDistance 옵션은 어떤 인덱스에서나 사용할 수 있습니다.

 

레거시 좌표 point 를 지정하기 위해선, 다음의 문법을 사용하세요 :

 

{
  $nearSphere: [ <x>, <y> ],
  $minDistance: <distance in radians>,
  $maxDistance: <distance in radians>
}

 

  • $minDistance 옵션은 쿼리가 2dsphere index 를 사용할 때만 가능하며, 중심점으로부터 적어도 지정한 거리만큼은 떨어진 documents 를 반환하도록 제한합니다.
  • $maxDistance 옵션은 어떤 인덱스에서나 사용할 수 있습니다.

만약 레거시 좌표에 경도와 위도를 사용한다면, 경도를 먼저 지정한 후에 위도를 지정하세요.

 

관련 문서 : 2d Indexes and Geospatial Near Queries

 

Behavior (동작)

Special Indexes Restriction (특수 인덱스 제한)

 

특수 geospatial index 를 필요로 하는 $nearSphere 연산자는 또 다른 특수 인덱스를 요구하는 쿼리 연산자나 명령어와 결합할 수 없습니다. 예를 들어 $nearSphere 과 $text 쿼리는 결합할 수 없습니다.

 

Sharded Collections (샤드된 콜렉션)

 

MongoDB 4.0 부터 $nearSphere 쿼리는 샤드된 콜렉션에 지원됩니다.

그 전 버전에서 $nearSphere 쿼리는 샤드된 콜렉션에 지원되지 않았습니다. 대신 샤드된 클러스터에서, 반드시 $geoNear aggregation stage 혹은 geoNear 명령어를 사용해야 했습니다. (MongoDB 4.0 및 그 이전 버전에서 사용 가능)

 

Sort Operation (정렬 연산)

 

$nearSphere 은 documents 를 거리에 의해 정렬합니다. 쿼리에 sort() 를 포함하고 있다면, sort() 는 이미 $nearSphere 에 의해 수행된 정렬 연산을 효과적으로 재정의해 매칭된 documents 를 재정렬 합니다. sort() 를 geospatial queries 와 함께 사용할 땐 $nearSphere 대신 documents 를 정렬하지않는 $geoWithin 연산자 사용을 고려해 보십시오.

 

Examples (예시)

Specify Center Point Using GeoJSON (GeoJSON 을 사용한 중심점 지정)

 

places 콜렉션의 documents 가 location 필드 및 2dsphere index 를 가지고 있다고 가정합니다.

다음 예시는 지정한 point 로부터 location1000m 에서 5000m 사이에 있는 데이터들을 가까운 것부터 먼 순서로 정렬해 반환합니다 :

 

db.places.find(
   {
     location: {
        $nearSphere: {
           $geometry: {
              type : "Point",
              coordinates : [ -73.9667, 40.78 ]
           },
           $minDistance: 1000,
           $maxDistance: 5000
        }
     }
   }
)

 

Specify Center Point Using Legacy Coordinates (레거시 좌표를 사용한 중심점 지정)

 

2d Index

 

legacyPlaces 콜렉션의 documents 가 레거시 좌표쌍의 location 필드 및 2d index 를 가지고 있다고 가정합니다.

다음의 예시는 location 이 지정한 점으로부터 최대 0.10 라디안만큼 떨어진 documents 를 가까운 것부터 먼 순서로 정렬해 반환합니다 :

 

db.legacyPlaces.find(
   { location : { $nearSphere : [ -73.9667, 40.78 ], $maxDistance: 0.10 } }
)

 

2dsphere Index

 

만약 콜렉션이 2dsphere index 를 갖고 있다면, $minDistance 옵션 또한 지정할 수 있습니다. 다음의 예시는 지정한 점으로부터 location 이 적어도 0.0004 라디안만큼 떨어진 documents 를 가까운 것부터 먼 순서로 정렬해 반환합니다 :

 

db.legacyPlaces.find(
   { location : { $nearSphere : [ -73.9667, 40.78 ], $minDistance: 0.0004 } }
)

 

 

출처 : https://docs.mongodb.com/manual/reference/operator/query/nearSphere/

 

$nearSphere — MongoDB Manual

Sort Operation $nearSphere sorts documents by distance. If you also include a sort() for the query, sort() re-orders the matching documents, effectively overriding the sort operation already performed by $nearSphere. When using sort() with geospatial queri

docs.mongodb.com

 

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

$center  (0) 2020.04.12
$box  (0) 2020.04.12
$near  (0) 2020.04.05
$geoWithin  (0) 2020.03.31
$geoIntersects  (0) 2020.03.25