Definición
$geoNearEmite documentos en orden de más cercano a más lejano desde un punto especificado.
Nota
La etapa
$geoNeartiene la siguiente forma de prototipo:{ $geoNear: { <geoNear options> } } El operador
$geoNearacepta un documento que contiene las siguientes opciones$geoNear. Especifique todas las distancias en las mismas unidades que las del sistema de coordenadas de los documentos procesados:CampoTipoDescripcióndistanceFieldstring
El campo de salida que contiene la distancia calculada. Para especificar un campo dentro de un documento incrustado, utiliza notación de puntos.
distanceMultiplierNúmero
Opcional. El factor para multiplicar todas las distancias devueltas por la consulta. Por ejemplo, use
distanceMultiplierpara convertir radianes, como los devueltos por una consulta esférica, a kilómetros multiplicándolos por el radio de la Tierra.includeLocsstring
opcional. Esto especifica el campo de salida que identifica la ubicación utilizada para calcular la distancia. Esta opción es útil cuando un campo de ubicación contiene varias ubicaciones. Para especificar un campo dentro de un documento incrustado, usa la notación de puntos.
keyOpcional. Especifique el campo indexado geoespacial que se utilizará al calcular la distancia.
Si su colección tiene
2dvarios2dsphereíndices o,debe usar lakeyopción para especificar la ruta del campo indexado. En "Especificar quéíndice geoespacial usar" se ofrece un ejemplo completo.Si hay más de un índice
2do más de un índice2dspherey no se especifica unkey, MongoDB devolverá un error.Si no especificas el
key, y tienes como máximo solo un índice2dy/o solo un índice2dsphere, MongoDB primero buscará un índice2dpara usar. Si un índice2dno existe, MongoDB busca un índice2dspherepara usar.maxDistanceNúmero
Opcional. La distancia máxima desde el punto central a la que pueden estar los documentos. MongoDB limita los resultados a los documentos que se encuentran dentro de la distancia especificada desde el punto central.
Especifique la distancia en metros si el punto especificado es GeoJSON y en radianes si el punto especificado son pares de coordenadas heredados.
minDistanceNúmero
opcional. La distancia mínima desde el punto central que los documentos pueden estar. MongoDB limita los resultados a aquellos documentos que se encuentran fuera de la distancia especificada desde el punto central.
Especifique la distancia en metros para los datos GeoJSON y en radianes para los pares de coordenadas heredados.
Novedad en la versión 3.2.
nearPunto GeoJSON o par de coordenadas antiguo
queryDocumento
opcional. Limita los resultados a los documentos que coinciden con la query. La sintaxis de queries es la sintaxis habitual de query para operaciones de lectura en MongoDB.
No puedes especificar un predicado de
$nearen el campoqueryde la etapa$geoNear.sphericalbooleano
Opcional. Determina cómo MongoDB calcula la distancia entre dos puntos:
trueCuando, MongoDB utiliza la semántica y calcula distancias utilizando geometría$nearSphereesférica.Al
false, MongoDB utiliza la$nearsemántica: geometría esférica para los índices 2dsphere e índices planares para los índices 2d.
Por defecto: falso.
Comportamiento
Cálculos de distancia
$geoNear calcula la distancia basándose en el punto más cercano del perímetro del documento de entrada.
Por ejemplo, si el documento de entrada es una forma, $geoNear identifica el punto del perímetro de la forma que está más cerca del punto especificado y proporciona la distancia entre el punto especificado y el punto más cercano de la forma.
Considerations
Al utilizar, tenga $geoNear en cuenta que:
Solo puedes usar como la primera etapa de una
$geoNearcanalización.Debe incluir la opción
distanceField. La opcióndistanceFieldespecifica el campo que contendrá la distancia calculada.$geoNearrequiere un índice geoespacial.Si tienes más de un índice geoespacial en la colección, utiliza el parámetro
keyspara especificar qué campo deseas usar en el cálculo. Si solo tienes un índice geoespacial,$geoNearusará implícitamente el campo indexado para el cálculo.
Ejemplos
Cree una colección places con los siguientes documentos:
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" } ] )
La siguiente operación crea un índice 2dsphere en el campo location:
db.places.createIndex( { location: "2dsphere" } )
Distancia máxima
Nota
La places colección anterior tiene un 2dsphere índice. La siguiente agregación utiliza para buscar documentos con una ubicación a un máximo $geoNear de 2 metros del centro [ -73.99279 , 40.719296 ] y category igual Parks a.
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 } } ])
La agregación devuelve lo siguiente:
{ "_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 ] } } }
El documento coincidente contiene dos nuevos campos:
dist.calculatedcampo que contiene la distancia calculada, ydist.locationcampo que contiene la ubicación utilizada en el cálculo
Distancia mínima
Nota
El siguiente ejemplo utiliza la opción minDistance para especificar la distancia mínima desde el punto central a la que pueden estar los documentos. La siguiente agregación encuentra todos los documentos con una ubicación al menos a 2 metros del centro [ -73.99279 , 40.719296 ] y category igual a Parks.
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 } } ])
Especifique qué índice geoespacial utilizar
Considere una places colección que tiene un índice 2dsphere en el location campo y un índice 2d en el legacy campo.
Un documento en la colección places es similar a lo siguiente:
{ "_id" : 3, "name" : "Polo Grounds", "location": { "type" : "Point", "coordinates" : [ -73.9375, 40.8303 ] }, "legacy" : [ -73.9375, 40.8303 ], "category" : "Stadiums" }
El siguiente ejemplo utiliza la opción key para especificar que la agregación debe utilizar los valores del campo location para la operación $geoNear en lugar de los valores del campo legacy. La pipeline también utiliza $limit para devolver como máximo 5 documentos.
Nota
db.places.aggregate([ { $geoNear: { near: { type: "Point", coordinates: [ -73.98142 , 40.71782 ] }, key: "location", distanceField: "dist.calculated", query: { "category": "Parks" } } }, { $limit: 5 } ])
La agregación devuelve lo siguiente:
{ "_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 } }