$geoNear 집계 단계에서는 각 문서의 지정된 지점과 위치 필드 사이의 거리를 계산하고, 문서를 거리별로 정렬하며, 필요에 따라 거리별로 결과를 제한할 수 있습니다.
문법
{
$geoNear: {
near: {
type: "Point",
coordinates: [<longitude>, <latitude>]
},
distanceField: <field to store distance>,
maxDistance: <optional maximum distance in meters>,
minDistance: <optional minimum distance in meters>,
query: <optional query conditions>,
includeLocs: <optional boolean to include locations>,
distanceMultiplier: <optional distance multiplier>,
spherical: <boolean, must be true>,
key: <optional field path>
}
}
매개 변수
| 매개 변수 | 유형 | Description |
|---|---|---|
near |
Object | 거리를 계산할 지점 |
distanceField |
String | 계산된 거리를 포함하는 필드입니다. |
maxDistance |
Number | Optional. 포인트에서 최대 거리(미터) |
minDistance |
Number | Optional. 지점으로부터의 최소 거리(미터) |
query |
문서 | 선택적 쿼리 조건 |
includeLocs |
불리언 (Boolean) | Optional. 결과에 위치 포함 |
distanceMultiplier |
Number | Optional. 거리를 이 값으로 곱합니다. |
spherical |
불리언 (Boolean) | 2dsphere 인덱스에 대해 true여야 합니다. |
key |
String | Optional. 거리 계산에 사용할 필드 경로 |
예시
스토어 컬렉션에서 이 샘플 문서를 고려합니다.
{
"_id": "2cf3f885-9962-4b67-a172-aa9039e9ae2f",
"name": "First Up Consultants | Bed and Bath Center - South Amir",
"location": {
"lat": 60.7954,
"lon": -142.0012
},
"staff": {
"totalStaff": {
"fullTime": 18,
"partTime": 17
}
},
"sales": {
"totalSales": 37701,
"salesByCategory": [
{
"categoryName": "Mattress Toppers",
"totalSales": 37701
}
]
},
"promotionEvents": [
{
"eventName": "Price Drop Palooza",
"promotionalDates": {
"startDate": {
"Year": 2024,
"Month": 9,
"Day": 21
},
"endDate": {
"Year": 2024,
"Month": 9,
"Day": 30
}
},
"discounts": [
{
"categoryName": "Bath Accessories",
"discountPercentage": 18
},
{
"categoryName": "Pillow Top Mattresses",
"discountPercentage": 17
}
]
}
]
}
예제 1: 기본 거리 계산
이 쿼리는 거리별로 정렬된 "VanArsdel 그림 프레임 저장소" 위치 근처의 모든 저장소를 검색합니다.
db.stores.aggregate([
{
$geoNear: {
near: {
type: "Point",
coordinates: [-141.9922, 16.8331] // VanArsdel Picture Frame Store location
},
distanceField: "distance",
spherical: true
}
},
{
$project: {
name: 1,
distance: 1
}
}
])
이 쿼리에서 반환된 처음 세 가지 결과는 다음과 같습니다.
[
{
"_id": "643b2756-c22d-4063-9777-0945b9926346",
"name": "Contoso, Ltd. | Outdoor Furniture Corner - Pagacfort",
"distance": 5458613.2813355485
},
{
"_id": "daa71e60-75d4-4e03-8b45-9df59af0811f",
"name": "First Up Consultants | Handbag Corner - South Salvatore",
"distance": 5469362.958855379
},
{
"_id": "02a78a15-b1fc-4bbd-ae1d-641b7428dc78",
"name": "VanArsdel, Ltd. | Kitchen Appliance Corner - Llewellynberg",
"distance": 5472684.4628977
}
]
예제 2: 거리 제한 및 선택적 쿼리 사용
이 쿼리는 10명 이상의 정규 직원이 있는 "Proseware Home Entertainment Hub"의 30KM 이내의 모든 매장을 검색합니다.
db.stores.aggregate([
{
$geoNear: {
near: {
type: "Point",
coordinates: [69.7296, 70.1272] // "Proseware Home Entertainment Hub" location
},
distanceField: "distance",
maxDistance: 30000, // 30 kilometers in meters
query: { "staff.totalStaff.fullTime": { $gt: 10 } },
spherical: true
}
},
{
$project: {
name: 1,
distance: 1,
"staff.totalStaff.fullTime": 1
}
}
])
이 쿼리에서 반환되는 첫 번째 결과는 다음과 같습니다.
[
{
"_id": "bbec6d3e-1666-45b4-8803-8b7ef8544845",
"name": "First Up Consultants | Baby Products Bargains - South Keenan",
"staff": {
"totalStaff": {
"fullTime": 19
}
},
"distance": 29934.71888123174
}
]
예제 3: 위치 데이터 및 거리 승수 포함
이 쿼리는 거리(킬로미터)와 포함된 위치 데이터를 포함하는 저장소를 검색합니다.
db.stores.aggregate([
{
$geoNear: {
near: {
type: "Point",
coordinates: [-38.4071, -47.2548] // "Fabrikam Car Accessory Outlet" location
},
distanceField: "distanceInKm",
includeLocs: "storeLocation",
distanceMultiplier: 0.001, // Convert meters to kilometers
spherical: true
}
},
{
$project: {
name: 1,
distanceInKm: 1,
storeLocation: 1
}
}
])
이 쿼리에서 반환된 처음 세 가지 결과는 다음과 같습니다.
[
{
"_id": "b677846e-bb73-46ec-9cba-7d94afee382c",
"name": "Northwind Traders | Health Food Shoppe - Brooklynmouth",
"storeLocation": {
"lat": -38.3032,
"lon": -132.7866
},
"distanceInKm": 9.095634270192285
},
{
"_id": "27c64b44-2382-4477-b3ce-c08e74882156",
"name": "Relecloud | VR Headset Gallery - West Jonasbury",
"storeLocation": {
"lat": -37.9628,
"lon": -132.6637
},
"distanceInKm": 34.7104536140246
},
{
"_id": "505e83eb-09bc-46a4-ba85-16135611b9de",
"name": "Fabrikam, Inc. | Pharmacy Hub - Elijahville",
"storeLocation": {
"lat": -38.0349,
"lon": -47.9571
},
"distanceInKm": 82.92766541748313
}
]
제한점
- 분할된 컬렉션과 함께 사용할 수 없습니다.
- 파이프라인당 하나의 $geoNear 단계만
- 파이프라인의 첫 번째 단계여야 합니다.
관련 콘텐츠
- MongoDB에서 Azure DocumentDB로 마이그레이션하기 위한 옵션을 검토합니다.
- MongoDB와의 기능 호환성에 대해 자세히 알아보세요.