Query para localizações próximas a um ponto em uma esfera
Você pode fazer query de dados de localização que aparecem próximos a um ponto específico em uma esfera.
Para consultar dados de localização próximos a um ponto especificado, utilize o operador $near
:
db.<collection>.find( { <location field> : { $near : { $geometry : { type : "Point", coordinates : [ <longitude>, <latitude> ] }, $maxDistance : <distance in meters> } } } )
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
-180
e180
, ambos inclusos.Os valores de latitude válidos estão entre
-90
e90
, ambos inclusos.
Especifique a distância no campo
$maxDistance
em metros.
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" } ] ) Os valores no campo
loc
são pontos GeoJSON.Para executar query de dados de localização com o operador
$near
, você deve criar um índice geoespacial no campo que contém os dados de localização.Crie um índice dsphere 2no campo
loc
:db.places.createIndex( { "loc": "2dsphere" } )
Procedimento
Use $near
para consultar a coleção. A seguinte query do $near
retorna documentos que têm um campo loc
dentro 5000 metros de um ponto GeoJSON localizado em [ -73.92, 40.78 ]
:
db.places.find( { loc: { $near: { $geometry: { type: "Point", coordinates: [ -73.92, 40.78 ] }, $maxDistance : 5000 } } } )
Saída:
[ { _id: ObjectId("63f7c3b15e5eefbdfef81cab"), loc: { type: 'Point', coordinates: [ -73.88, 40.78 ] }, name: 'La Guardia Airport', category: 'Airport' }, { _id: ObjectId("63f7c3b15e5eefbdfef81caa"), loc: { type: 'Point', coordinates: [ -73.97, 40.77 ] }, name: 'Central Park', category: 'Park' } ]
Os resultados são classificados por distância do ponto consultado, do mais próximo para o mais distante.