정의
$geoNear지정된 점을 기준으로 가장 가까운 것부터 가장 먼 것 순으로 문서를 출력합니다.
참고
$geoNear단계의 프로토타입 형식은 다음과 같습니다.{ $geoNear: { <geoNear options> } } $geoNear연산자는 다음$geoNear옵션이 포함된 문서를 허용합니다. 처리된 문서의 좌표계와 동일한 단위로 모든 거리를 지정합니다.필드유형설명distanceField문자열
계산된 거리가 포함된 출력 필드입니다. 내장된 문서 내에서 필드를 지정하려면 점 표기법을 사용합니다.
distanceMultiplier숫자
선택 사항. 쿼리에서 반환된 모든 거리를 곱하는 요소입니다. 예를 들어 구형 쿼리에서 반환된 라디안을 지구 반지름으로 곱하여 킬로미터로 변환하려면
distanceMultiplier를 사용합니다.includeLocs문자열
선택 사항. 거리를 계산하는 데 사용되는 위치를 식별하는 출력 필드를 지정합니다. 이 옵션은 위치 필드에 여러 위치가 포함된 경우 유용합니다. 내장된 문서 내에서 필드를 지정하려면 점 표기법을 사용합니다.
key선택 사항입니다. 거리를 계산할 때 사용할 지리 공간적 인덱스 필드를 지정합니다.
컬렉션 여러 개의
2d및 여러 개의2dsphere인덱스가 있는 경우key옵션을 사용하여 사용할 인덱싱된 필드 경로 지정해야 합니다. 사용할 지리 공간적 인덱스 지정하기에서 전체 예시 제공합니다.2d인덱스가 두 개 이상이거나2dsphere인덱스가 두 개 이상이고key를 지정하지 않은 경우 MongoDB는 오류를 반환합니다.key를 지정하지 않고 최대 하나의2d인덱스 및 하나의2dsphere인덱스만 있는 경우 MongoDB는 먼저 사용할2d인덱스를 찾습니다.2d인덱스가 없으면 MongoDB는 사용할2dsphere인덱스를 찾습니다.maxDistance숫자
minDistance숫자
선택 사항입니다. 문서가 위치할 수 있는 중심점으로부터의 최소 거리입니다. MongoDB는 중심점에서 지정된 거리를 벗어나는 문서로 결과를 제한합니다.
GeoJSON 데이터의 경우 미터 단위로, 레거시 좌표 쌍의 경우 라디안 단위로 거리를 지정합니다.
버전 3.2에 새로 추가되었습니다.
nearGeoJSON 포인트 또는 레거시 좌표 쌍
query문서
spherical부울
선택 사항. MongoDB가 두 포인트 사이의 거리를 계산하는 방법을 결정합니다:
true인 경우 MongoDB는$nearSphere시맨틱을 사용하고 구형 기하학을 사용하여 거리를 계산합니다.false일 경우, MongoDB는 2dsphere 인덱스에는 구면 기하학, 2d 인덱스에는 평면 기하학을 적용하는$near시맨틱을 사용합니다.
기본값: false.
행동
거리 계산
$geoNear 입력 문서 둘레의 가장 가까운 점 기준으로 거리를 계산합니다.
예시 들어, 입력 문서 도형인 경우 는 도형의 둘레에서 지정된 점 에 가장 가까운 점 식별하고 지정된 점 과 도형의 가장 가까운 점 사이의 거리를$geoNear 출력합니다.
고려 사항
$geoNear를 사용할 때는 다음 사항을 고려하세요.
$geoNear는 파이프라인의 첫 번째 단계로만 사용할 수 있습니다.반드시
distanceField옵션을 포함해야 합니다.distanceField옵션은 계산된 거리를 포함할 필드를 지정합니다.$geoNear는 지리 공간적 인덱스가 필요합니다.컬렉션에 두 개 이상의 지리 공간적 인덱스가 있는 경우
keys매개변수를 사용하여 계산에 사용할 필드를 지정합니다. 지리 공간적 인덱스가 하나만 있는 경우$geoNear는 암시적으로 계산에 인덱싱된 필드를 사용합니다.
예시
다음 문서를 사용하여 컬렉션 places를 생성합니다.
db.places.insertMany( [ { name: "Central Park", location: { type: "Point", coordinates: [ -73.97, 40.77 ] }, category: "Parks" }, { name: "Sara D. Roosevelt Park", location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] }, category: "Parks" }, { name: "Polo Grounds", location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] }, category: "Stadiums" } ] )
다음 작업은 location 필드에 2dsphere 인덱스를 생성합니다:
db.places.createIndex( { location: "2dsphere" } )
최대 거리
참고
위의 places 컬렉션에는 2dsphere 인덱스가 있습니다. 다음 집계는 $geoNear를 사용하여 중심 [ -73.99279 , 40.719296 ]에서 최대 2m 떨어져 있고 Parks와 같은 category가 있는 문서를 찾습니다.
db.places.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] }, distanceField: "dist.calculated", maxDistance: 2, query: { category: "Parks" }, includeLocs: "dist.location", spherical: true } } ])
집계는 다음을 반환합니다.
{ "_id" : 8, "name" : "Sara D. Roosevelt Park", "category" : "Parks", "location" : { "type" : "Point", "coordinates" : [ -73.9928, 40.7193 ] }, "dist" : { "calculated" : 0.9539931676365992, "location" : { "type" : "Point", "coordinates" : [ -73.9928, 40.7193 ] } } }
일치하는 문서에는 다음과 같이 두 개의 새로운 필드가 포함되어 있습니다.
dist.calculated계산된 거리가 포함된 필드dist.location필드는 계산에 사용된 위치를 포함합니다.
최소 거리
참고
다음 예시에서는 minDistance 옵션을 사용하여 문서가 위치할 수 있는 중심점으로부터의 최소 거리를 지정합니다. 다음 집계에서는 위치가 중심 [ -73.99279 , 40.719296 ]에서 2미터 이상 떨어져 있고, category가 Parks인 모든 문서를 찾습니다.
db.places.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] }, distanceField: "dist.calculated", minDistance: 2, query: { category: "Parks" }, includeLocs: "dist.location", spherical: true } } ])
사용할 지리 공간적 인덱스 지정
places 컬렉션에서 location 필드에 2dsphereplaces 인덱스 및 legacy 필드에 2d 인덱스가 있다고 가정해 보겠습니다.
places 컬렉션의 문서는 다음과 유사합니다.
{ "_id" : 3, "name" : "Polo Grounds", "location": { "type" : "Point", "coordinates" : [ -73.9375, 40.8303 ] }, "legacy" : [ -73.9375, 40.8303 ], "category" : "Stadiums" }
다음 예시에서는 key 옵션을 사용해 $geoNear 작업에 집계가 legacy 필드 값이 아닌 location 필드 값을 사용하도록 지정합니다. 또한 파이프라인은 $limit를 사용하여 문서를 최대 5개 반환합니다.
참고
db.places.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ -73.98142 , 40.71782 ] }, key: "location", distanceField: "dist.calculated", query: { "category": "Parks" } } }, { $limit: 5 } ])
집계는 다음을 반환합니다.
{ "_id" : 8, "name" : "Sara D. Roosevelt Park", "location" : { "type" : "Point", "coordinates" : [ -73.9928, 40.7193 ] }, "category" : "Parks", "dist" : { "calculated" : 974.175764916902 } } { "_id" : 1, "name" : "Central Park", "location" : { "type" : "Point", "coordinates" : [ -73.97, 40.77 ] }, "legacy" : [ -73.97, 40.77 ], "category" : "Parks", "dist" : { "calculated" : 5887.92792958097 } }