Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El operador $near devuelve documentos cuyo campo de ubicación está cerca de un punto especificado, ordenado por distancia. Requiere un índice "2dsphere" y devuelve documentos del más cercano al más lejano.
Syntax
{
<location field>: {
$near: {
$geometry: {
type: "Point",
coordinates: [<longitude>, <latitude>]
},
$maxDistance: <distance in meters>,
$minDistance: <distance in meters>
}
}
}
Parámetros
| Parámetro | Description |
|---|---|
location field |
Campo que contiene el GeoJSON Point |
$geometry |
Objeto GeoJSON Point que especifica el punto central |
$maxDistance |
Optional. Distancia máxima en metros desde el punto central |
$minDistance |
Optional. Distancia mínima en metros desde el punto central |
Prerrequisito
Para mejorar el rendimiento, empiece por crear el índice necesario 2dsphere .
db.stores.createIndex({ "location": "2dsphere" })
Examples
Vamos a comprender el uso con un JSON de ejemplo del conjunto de datos stores.
{
"_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
}
Ejemplo 1: Búsqueda de proximidad básica
La consulta recupera los dos almacenes más cercanos a un punto geográfico específico (70.1272, 69.7296) mediante la búsqueda geoespacial. Esta consulta busca ubicaciones más cercanas al punto especificado y devuelve almacenes en orden ascendente de distancia desde el punto.
db.stores.find({
'location': {
$near: {
$geometry: {
type: "Point",
coordinates: [69.7296, 70.1272] // [longitude, latitude]
}
}
}
}, {
name: 1,
location: 1
}).limit(2)
Los dos primeros resultados devueltos por esta consulta son:
[
{
"_id": "3882eb86-5dd6-4701-9640-f670ccb67859",
"name": "Fourth Coffee | DJ Equipment Stop - Schuppestad",
"location": { "lat": 69.4923, "lon": 70.1851 }
},
{
"_id": "bbec6d3e-1666-45b4-8803-8b7ef8544845",
"name": "First Up Consultants | Baby Products Bargains - South Keenan",
"location": { "lat": 69.2158, "lon": 70.3328 }
}
]
Ejemplo 2: Uso de distancia mínima y máxima
La consulta recupera almacenes dentro de un intervalo de 20 km a 200 km desde un punto especificado y calcula sus distancias en kilómetros. Esta consulta busca en un área "con forma de anillo": buscar almacenes que estén al menos a 20 metros de distancia, pero no más de 200 metros del punto especificado.
db.stores.aggregate([
{
$geoNear: {
near: {
type: "Point",
coordinates: [70.3328, 69.2158]
},
distanceField: "distance",
minDistance: 20,
maxDistance: 200,
spherical: true
}
},
{
$project: {
name: 1,
location: 1,
distanceKm: { $divide: ["$distance", 1000] },
_id: 0
}
},
{ $limit: 2 }
])