Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

$geoNear (집계)

이 페이지의 내용

  • 정의
  • 행동
  • 예시
$geoNear

지정된 점을 기준으로 가장 가까운 것부터 가장 먼 것 순으로 문서를 출력합니다.

참고

MongoDB는 $geoNear 단계에 대한 limitnum 옵션과 문서 100개 기본 제한을 제거합니다. $geoNear 결과를 제한하려면 $geoNear 단계를 $limit 단계와 함께 사용하세요.

$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
숫자

선택 사항입니다. 문서가 위치할 수 있는 중심점으로부터의 최대 거리입니다. MongoDB는 중심점에서 지정된 거리 내에 있는 문서로 결과를 제한합니다.

지정된 지점이 GeoJSON인 경우 거리를 미터 단위로 지정하고, 지정된 지점이 레거시 좌표 쌍인 경우 라디안 단위로 지정합니다.

minDistance
숫자

선택 사항입니다. 문서가 위치할 수 있는 중심점으로부터의 최소 거리입니다. MongoDB는 중심점에서 지정된 거리를 벗어나는 문서로 결과를 제한합니다.

GeoJSON 데이터의 경우 미터 단위로, 레거시 좌표 쌍의 경우 라디안 단위로 거리를 지정합니다.

near
GeoJSON 포인트 또는 레거시 좌표 쌍

가장 가까운 문서를 찾을 수 있는 점입니다.

2D스피어 인덱스를 사용하는 경우, 포인트를 GeoJSON 포인트 또는 레거시 좌표 쌍으로 지정할 수 있습니다.

2D 인덱스를 사용하는 경우, 점을 레거시 좌표 쌍으로 지정합니다.

query
문서

선택 사항입니다. 결과를 쿼리와 일치하는 문서로 제한합니다. 쿼리 구문은 일반적인 MongoDB 읽기 작업 쿼리 구문입니다.

$geoNear 단계의 query 필드에는 $near 술어를 지정할 수 없습니다.

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" } )

참고

MongoDB는 $geoNear 단계에 대한 limitnum 옵션과 문서 100개 기본 제한을 제거합니다. $geoNear 결과를 제한하려면 $geoNear 단계와 $limit 단계를 함께 사용합니다.

위의 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 필드는 계산에 사용된 위치를 포함합니다.

참고

MongoDB는 $geoNear 단계에 대한 limitnum 옵션과 문서 100개 기본 제한을 제거합니다. $geoNear 결과를 제한하려면 $geoNear 단계와 $limit 단계를 함께 사용합니다.

다음 예시에서는 minDistance 옵션을 사용하여 문서가 위치할 수 있는 중심점으로부터의 최소 거리를 지정합니다. 다음 집계에서는 위치가 중심 [ -73.99279 , 40.719296 ]에서 2미터 이상 떨어져 있고, categoryParks인 모든 문서를 찾습니다.

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
}
}
])

이 예시에서는

  • let 옵션은 [-73.99279,40.719296] 배열 값을 $pt 변수에 설정하는 데 사용됩니다.

  • $pt$geoNear 단계에서 near 매개변수에 대한 let 옵션으로 지정됩니다.

db.places.aggregate(
[
{
"$geoNear":
{
"near":"$$pt",
"distanceField":"distance",
"maxDistance":2,
"query":{"category":"Parks"},
"includeLocs":"dist.location",
"spherical":true
}
}
],
{
"let":{ "pt": [ -73.99279, 40.719296 ] }
}
)

집계는 다음을 포함하는 모든 문서를 반환합니다.

  • let 변수에 정의된 점에서 최대 2미터 떨어진 위치입니다

  • Parks와 동일한 category.

{
_id: ObjectId("61715cf9b0c1d171bb498fd7"),
name: 'Sara D. Roosevelt Park',
location: { type: 'Point', coordinates: [ -73.9928, 40.7193 ] },
category: 'Parks',
distance: 1.4957325341976439e-7,
dist: { location: { type: 'Point', coordinates: [ -73.9928, 40.7193 ] } }
},
{
_id: ObjectId("61715cf9b0c1d171bb498fd6"),
name: 'Central Park',
location: { type: 'Point', coordinates: [ -73.97, 40.77 ] },
category: 'Parks',
distance: 0.0009348548688841822,
dist: { location: { type: 'Point', coordinates: [ -73.97, 40.77 ] } }
}

let 옵션은 $geoNear 쿼리에 사용할 수 있는 변수를 바인딩할 수 있습니다.

이 예시에서 $lookup은(는) 다음을 사용합니다.

  • let : $pt를 정의하기 위해

  • pipeline$geoNear입니다.

  • $pt $geoNear 파이프라인 단계에서 near를 정의합니다.

db.places.aggregate( [
{
$lookup: {
from: "places",
let: { pt: "$location" },
pipeline: [
{
$geoNear: {
near: "$$pt",
distanceField: "distance"
}
}
],
as: "joinedField"
}
},
{
$match: { name: "Sara D. Roosevelt Park" }
}
] );

집계는 다음을 포함하는 문서를 반환합니다.

  • '사라 D. 루즈벨트 공원(Sara D. Roosevelt Park)' 문서를 주요 문서로 사용합니다.

  • $pt 변수로 거리를 계산해 컬렉션 내 모든 문서를 subDocuments로 반환합니다.

{
_id: ObjectId("61715cf9b0c1d171bb498fd7"),
name: 'Sara D. Roosevelt Park',
location: { type: 'Point', coordinates: [ -73.9928, 40.7193 ] },
category: 'Parks',
joinedField: [
{
_id: ObjectId("61715cf9b0c1d171bb498fd7"),
name: 'Sara D. Roosevelt Park',
location: { type: 'Point', coordinates: [ -73.9928, 40.7193 ] },
category: 'Parks',
distance: 0
},
{
_id: ObjectId("61715cf9b0c1d171bb498fd6"),
name: 'Central Park',
location: { type: 'Point', coordinates: [ -73.97, 40.77 ] },
category: 'Parks',
distance: 5962.448255234964
},
{
_id: ObjectId("61715cfab0c1d171bb498fd8"),
name: 'Polo Grounds',
location: { type: 'Point', coordinates: [ -73.9375, 40.8303 ] },
category: 'Stadiums',
distance: 13206.535424939102
}
]
}

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개 반환합니다.

참고

MongoDB는 $geoNear 단계에 대한 limitnum 옵션과 문서 100개 기본 제한을 제거합니다. $geoNear 결과를 제한하려면 $geoNear 단계와 $limit 단계를 함께 사용합니다.

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
}
}

돌아가기

$fill

이 페이지의 내용