Los índices 2D admiten ciertos operadores del query que calculan las distancias mediante geometría esférica. Los operadores del query esféricos usan radianes para la distancia. Para usar operadores del query esféricos con un índice 2d, se deben convertir las distancias a radianes.
Los índices 2d soportan los siguientes operadores del query esférica:
Etapa de pipeline
$geoNearcon la opciónspherical: true
Acerca de esta tarea
Usar un índice 2d para consultas sobre datos esféricos puede devolver resultados incorrectos o un error. Por ejemplo, los índices 2d no admiten consultas esféricas que envuelvan los polos.
Si tus datos están almacenados como longitud y latitud y a menudo ejecutas consultas en superficies esféricas, utiliza un índice 2dsphere en lugar de un índice 2d.
Al especificar las coordenadas de longitud y latitud, enumere primero la longitud y luego la latitud.
Los valores de longitud válidos están entre
-180y180, ambos inclusive.Los valores de latitud válidos están entre
-90y90, ambos inclusive.
Procedimiento
Para convertir la distancia a radianes, divide la distancia por el radio de la esfera (por ejemplo, la Tierra) en las mismas unidades que la medida de la distancia.
El radio ecuatorial de la Tierra es de aproximadamente 3.963,2 millas o 6.378,1 kilómetros.
Ejemplos
Los siguientes ejemplos utilizan el operador $centerSphere para realizar query. El operador $centerSphere utiliza radianes para calcular la distancia.
Crear la colección contacts:
db.contacts.insertMany( [ { name: "Evander Otylia", phone: "202-555-0193", address: [ 55.5, 42.3 ] }, { name: "Georgine Lestaw", phone: "714-555-0107", address: [ -74, 44.74 ] } ] )
El campo address contiene legacy coordinate pairs.
Convertir millas a radianes
La siguiente query devuelve documentos donde el campo address se encuentra dentro de un círculo con punto central [ -72, 44 ] y un radio de 200 millas:
db.contacts.find( { address: { $geoWithin: { $centerSphere: [ [ -72, 44 ] , 200 / 3963.2 ] } } } )
Salida:
[ { _id: ObjectId("647e565c6cdaf4dc323ec92d"), name: 'Georgine Lestaw', phone: '714-555-0107', address: [ -74, 44.74 ] } ]
En la query anterior, para convertir 200 millas a radianes, se dividieron las millas especificadas entre 3963,2.
Convertir kilómetros a radianes
La siguiente query devuelve documentos donde el campo address está dentro de un círculo con punto central [ 55, 42 ] y un radio de 500 kilómetros:
db.contacts.find( { address: { $geoWithin: { $centerSphere: [ [ 55, 42 ] , 500 / 6378.1 ] } } } )
Salida:
[ { _id: ObjectId("647e565c6cdaf4dc323ec92c"), name: 'Evander Otylia', phone: '202-555-0193', address: [ 55.5, 42.3 ] } ]
En la consulta anterior, para convertir 500 kilómetros a radianes, los kilómetros especificados se dividieron por 6378.1.