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 $nearSphere devuelve documentos con campos de ubicación cerca de un punto especificado en una esfera, calculando distancias mediante geometría esférica. El operador es más preciso para los cálculos basados en la Tierra que $near.
Syntax
{
<location field>: {
$nearSphere: {
$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 en una superficie esférica |
$minDistance |
Optional. Distancia mínima en metros en una superficie esférica |
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
}
Para mejorar el rendimiento, empiece por crear el índice necesario 2dsphere .
db.stores.createIndex({ "location": "2dsphere" })
Ejemplo 1: Búsqueda esférica básica
La consulta recupera almacenes más cercanos a un punto especificado (-141.9922, 16.8331) en una superficie esférica (similar a la Tierra).
db.stores.find({
'location': {
$nearSphere: {
$geometry: {
type: "Point",
coordinates: [-141.9922, 16.8331]
}
}
}
}, {
name: 1,
location: 1
}).limit(2)
Los dos primeros resultados devueltos por esta consulta son:
[
{
"_id": "643b2756-c22d-4063-9777-0945b9926346",
"name": "Contoso, Ltd. | Outdoor Furniture Corner - Pagacfort",
"location": {
"type": "Point",
"coordinates": [152.1353, -89.8688]
}
},
{
"_id": "daa71e60-75d4-4e03-8b45-9df59af0811f",
"name": "First Up Consultants | Handbag Corner - South Salvatore",
"location": {
"type": "Point",
"coordinates": [150.2305, -89.8431]
}
}
]
Ejemplo 2: Análisis de distancia compleja
Esta consulta recupera almacenes entre 20 metros y 200 metros del punto (65,3765, -44,8674). La consulta busca en un área "con forma de anillo", buscando 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: [65.3765, -44.8674]
},
distanceField: "sphericalDistance",
minDistance: 20,
maxDistance: 200,
spherical: true
}
},
{
$project: {
name: 1,
location: 1,
distanceKm: { $divide: ["$sphericalDistance", 1000] },
_id: 0
}
},
{
$limit: 2
}
])
Diferencia clave entre el operador $nearSphere y $near.
- El antiguo utiliza geometría esférica para los cálculos de distancia.
- El anterior es más preciso para los cálculos de distancia basados en la Tierra.
- El primero es mejor para las aplicaciones que requieren cálculos precisos de distancia global.