Você pode consultar dados de localização dentro de um círculo na superfície de uma esfera. Use essas queries para retornar dados dentro de um limite esférico.
Para executar query de dados de localização dentro de um círculo em uma esfera, utilize $geoWithin com o operador $centerSphere . No operador $centerSphere , especifique as coordenadas e o raio do círculo para a query:
db.<collection>.find( { <location field> : { $geoWithin : { $centerSphere: [ [ <longitude>, <latitude> ], <radius> ] } } } )
Sobre esta tarefa
Quando você especificar coordenadas de longitude e latitude, liste primeiro a longitude e depois a latitude.
Os valores de longitude válidos estão entre
-180e180, ambos inclusos.Os valores de latitude válidos estão entre
-90e90, ambos inclusos.
No operador
$centerSphere, especifique o raio do círculo em radianos. Para converter outras unidades de e para radianos, consulte Converter distância para radianos para operadores esféricos.Este exemplo calcula a distância em quilômetros. Para converter quilômetros para radianos, divida o valor do quilômetro por
6378.1.
$geoWithinnão exige um índice geoespacial. No entanto, um índice geoespacial melhora o desempenho da query. Somente o índice geoespacial 2dsphere suporta$geoWithin. Para mais informações, consulte Criar um índice 2dsphere.
Antes de começar
Crie uma coleção places que contenha estes documento:
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" } ] )
Procedimento
Para fazer query da collection, use $geoWithin com o operador $centerSphere :
db.places.find( { loc: { $geoWithin: { $centerSphere: [ [ -1.76, 51.16 ], 10 / 6378.1 ] } } } )
A query retorna documentos onde o campo loc está dentro de um raio de 10 quilômetros de um ponto na longitude -1.76, latitude 51.16.
Saída:
[ { _id: ObjectId("63fd205e4a08b5e248c03e32"), loc: { type: 'Point', coordinates: [ -1.83, 51.18 ] }, name: 'Stonehenge', category: 'Monument' } ]