$geoNear (집계)
정의
$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에 새로 추가되었습니다.
near
GeoJSON 포인트 또는 레거시 좌표 쌍
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 } }