Se puede query datos de ubicación dentro de un círculo en la superficie de una esfera. Utiliza estas queries para devolver datos dentro de una capa esférica.
Para consultar datos de ubicación dentro de un círculo en una esfera, utilice $geoWithin con el operador $centerSphere. En el operador $centerSphere, especifique las coordenadas y el radio del círculo dentro del cual query:
db.<collection>.find( { <location field> : { $geoWithin : { $centerSphere: [ [ <longitude>, <latitude> ], <radius> ] } } } )
Acerca de esta tarea
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.
En el operador
$centerSphere, especifica el radio del círculo en radianes. Para convertir otras unidades a y desde radianes, consulta Convertir distancia a radianes para operadores esféricos.- Este ejemplo calcula la distancia en kilómetros. Para convertir kilómetros a radianes, divide el valor en kilómetros por
6378.1.
$geoWithinno requiere un índice geoespacial. Sin embargo, un índice geoespacial mejora el rendimiento de las query. Solo el índice geoespacial 2dsphere admite$geoWithin. Para obtener más información, consulta Crea un índice 2dsphere.
Antes de comenzar
Crea una colección places que contenga estos documentos:
db.places.insertMany( [ { loc: { type: "Point", coordinates: [ -73.97, 40.77 ] }, name: "Central Park", category : "Park" }, { loc: { type: "Point", coordinates: [ -73.88, 40.78 ] }, name: "La Guardia Airport", category: "Airport" }, { loc: { type: "Point", coordinates: [ -1.83, 51.18 ] }, name: "Stonehenge", category : "Monument" } ] )
Procedimiento
Para consultar la colección, use $geoWithin con el operador $centerSphere:
db.places.find( { loc: { $geoWithin: { $centerSphere: [ [ -1.76, 51.16 ], 10 / 6378.1 ] } } } )
La query devuelve documentos en los que el campo loc se encuentra dentro de un radio de 10 kilómetros de un punto en la longitud -1.76, latitud 51.16.
Salida:
[ { _id: ObjectId("63fd205e4a08b5e248c03e32"), loc: { type: 'Point', coordinates: [ -1.83, 51.18 ] }, name: 'Stonehenge', category: 'Monument' } ]