$polygon 연산자는 공간 쿼리에 대한 다각형을 정의하여 불규칙한 모양 내에서 위치를 찾을 수 있도록 합니다. 연산자는 복잡한 지리적 경계 내에서 위치를 쿼리하는 데 유용합니다.
문법
{
<location field>: {
$geoWithin: {
$geometry: {
type: "Polygon",
coordinates: [
[[<longitude1>, <latitude1>], ..., [<longitudeN>, <latitudeN>], [<longitude1>, <latitude1>]]
]
}
}
}
}
매개 변수
| 매개 변수 | Description |
|---|---|
location field |
지리 공간적 데이터를 포함하는 필드 |
coordinates |
다각형을 형성하는 좌표 쌍의 배열. 다각형을 닫으려면 첫 번째 점과 마지막 점이 동일해야 함 |
예시
stores 데이터 세트의 샘플 json을 통해 사용법을 이해해 보겠습니다.
{
"_id": "a715ab0f-4c6e-4e9d-a812-f2fab11ce0b6",
"name": "Lakeshore Retail | Holiday Supply Hub - Marvinfort",
"location": { "lat": -74.0427, "lon": 160.8154 },
"staff": { "employeeCount": { "fullTime": 9, "partTime": 18 } },
"sales": {
"salesByCategory": [ { "categoryName": "Stockings", "totalSales": 25731 } ],
"revenue": 25731
},
"promotionEvents": [
{
"eventName": "Mega Savings Extravaganza",
"promotionalDates": {
"startDate": { "Year": 2023, "Month": 6, "Day": 29 },
"endDate": { "Year": 2023, "Month": 7, "Day": 7 }
},
"discounts": [
{ "categoryName": "Stockings", "discountPercentage": 16 },
{ "categoryName": "Tree Ornaments", "discountPercentage": 8 }
]
},
{
"eventName": "Incredible Discount Days",
"promotionalDates": {
"startDate": { "Year": 2023, "Month": 9, "Day": 27 },
"endDate": { "Year": 2023, "Month": 10, "Day": 4 }
},
"discounts": [
{ "categoryName": "Stockings", "discountPercentage": 11 },
{ "categoryName": "Holiday Cards", "discountPercentage": 9 }
]
},
{
"eventName": "Massive Deal Mania",
"promotionalDates": {
"startDate": { "Year": 2023, "Month": 12, "Day": 26 },
"endDate": { "Year": 2024, "Month": 1, "Day": 2 }
},
"discounts": [
{ "categoryName": "Gift Bags", "discountPercentage": 21 },
{ "categoryName": "Bows", "discountPercentage": 19 }
]
},
{
"eventName": "Super Saver Soiree",
"promotionalDates": {
"startDate": { "Year": 2024, "Month": 3, "Day": 25 },
"endDate": { "Year": 2024, "Month": 4, "Day": 1 }
},
"discounts": [
{ "categoryName": "Tree Ornaments", "discountPercentage": 15 },
{ "categoryName": "Stockings", "discountPercentage": 14 }
]
},
{
"eventName": "Fantastic Savings Fiesta",
"promotionalDates": {
"startDate": { "Year": 2024, "Month": 6, "Day": 23 },
"endDate": { "Year": 2024, "Month": 6, "Day": 30 }
},
"discounts": [
{ "categoryName": "Stockings", "discountPercentage": 24 },
{ "categoryName": "Gift Wrap", "discountPercentage": 16 }
]
},
{
"eventName": "Price Plunge Party",
"promotionalDates": {
"startDate": { "Year": 2024, "Month": 9, "Day": 21 },
"endDate": { "Year": 2024, "Month": 9, "Day": 28 }
},
"discounts": [
{ "categoryName": "Holiday Tableware", "discountPercentage": 13 },
{ "categoryName": "Holiday Cards", "discountPercentage": 11 }
]
}
],
"company": "Lakeshore Retail",
"city": "Marvinfort",
"storeOpeningDate": { "$date": "2024-10-01T18:24:02.586Z" },
"lastUpdated": { "$timestamp": { "t": 1730485442, "i": 1 } },
"storeFeatures": 38
}
예제 1 - 다각형 내에서 검색
쿼리는 제공된 좌표에 따라 사용자 지정 다각형 영역에 속하는 저장소를 검색합니다.
db.stores.find({
location: {
$geoWithin: {
$geometry: {
type: "Polygon",
coordinates: [[
[-141.9922, 16.8331], // VanArsdel Picture Frame Store
[-112.7858, -29.1866], // First Up Consultants Microphone Bazaar
[-38.4071, -47.2548], // Fabrikam Car Accessory Outlet
[-141.9922, 16.8331] // Close the polygon by repeating first point
]]
}
}
}
},
{
name: 1,
location: 1
}).limit(2)
이 쿼리에서 반환된 처음 두 가지 결과는 다음과 같습니다.
[
{
"_id": "4a417727-a002-4c80-a01f-bc9526b300a5",
"name": "Northwind Traders | Bed and Bath Deals - East Duane",
"location": {
"type": "Point",
"coordinates": [-46.1444, -60.9697]
}
},
{
"_id": "1e27040c-7242-4970-8893-e5738e1bc1ca",
"name": "Northwind Traders | Seasonal Decoration Bazaar - Cassidyberg",
"location": {
"type": "Point",
"coordinates": [-44.3617, -81.2186]
}
}
]