Visão geral
Você pode executar query de dados baseado em localização geográfica utilizando operadores de consulta geoespacial. Você pode formatar queries geoespaciais utilizando um dos seguintes sistemas de coordenadas:
Esta seção contém exemplos de queries geoespaciais utilizando diferentes operadores de consulta que você pode executar no seu conjunto de dados de amostra do Atlas.
Coordenadas em uma esfera semelhante à Terra
Para queries geoespaciais utilizando coordenadas de latitude e longitude em uma esfera semelhante à Terra, utilize o formato de consulta GeoJSON. Embora o GeoJSON tenha vários tipos, todos os tipos de dados GeoJSON usam alguma forma da estrutura a seguir:
<field> : { type: <GeoJSON type>, coordinates: [ [longitude_1, latitude_1], ... [longitude_n, latitude_n] ] }
O tipo de objeto determina o número de coordenadas. Por exemplo, um Point
requer apenas uma coordenada: uma longitude e uma latitude. Um Line
utiliza duas coordenadas: uma longitude e uma latitude para cada extremidade. Um Polygon
consiste em uma lista de coordenadas nas quais a primeira e a última coordenadas são iguais, fechando efetivamente o polígono. Para saber mais sobre as formas GeoJSON que você pode usar no MongoDB, consulte a entrada do manual GeoJSON.
Para habilitar a consulta de dados GeoJSON, você deve adicionar o campo em um índice do 2dsphere
. O seguinte trecho cria um índice no campo location.geo
na coleção theaters
utilizando o método createIndex()
:
db.theaters.createIndex({location.geo: "2dsphere"});
Coordenadas em um plano 2D
Você também pode expressar queries geoespaciais utilizando coordenadas do x
e y
em um plano Euclidiano bidimensional. Até MongoDB, este era o único formato compatível com queries geoespaciais, e agora são referidos como "pares de coordenadas legadas".
Os pares de coordenadas legadas utilizam a seguinte estrutura:
<field> : [ x, y ]
O campo contém uma array de dois valores em que o primeiro representa o valor do eixo x
e o segundo representa o valor do eixo y
.
Para habilitar a consulta utilizando pares de coordenadas legadas, crie um índice 2d
no campo na coleção. O seguinte trecho cria um índice no campo coordinates
na coleção shipwrecks
utilizando o método createIndex()
:
db.shipwrecks({coordinates: "2d"});
Consulte a página do manual do MongoDB Server em legacy coordinate pairs para obter mais informações.
Observação
Os índices esféricos (2dsphere
) e planos (2d
) suportam alguns, mas não todos, dos mesmos operadores de query. Para uma lista completa de operadores e sua compatibilidade de índice, consulte a entrada manual para queries geoespaciais.
Exemplos
Os exemplos seguintes utilizam o conjunto de dados de amostra do MongoDB Atlas . Você pode aprender como definir seu próprio Atlas cluster de camada grátis e como carregar o conjunto de dados de exemplo em nosso guia de Introdução.
Os exemplos utilizam a coleção do theaters
no banco de dados do sample_mflix
a partir do conjunto de dados de amostra. A coleção theaters
contém um índice 2dsphere
no campo location.geo
.
Query por proximidade
O operador $near aceita um conjunto de coordenadas de longitude-latitude e retorna documentos ordenados do mais próximo para o mais distante. Para limitar os resultados a uma distância máxima em metros, utilize a opção $maxDistance
. Para obter uma lista completa de opções, consulte a documentação de referência do $near
. O exemplo a seguir consulta cinemas dentro de 10,000
metros de [ -73.9667, 40.78 ]
.
// Find theaters within a certain proximity async function proximity(theaters) { // Define the query to find theaters near a specific location const query = { "location.geo": { $near: { $geometry: { type: "Point", coordinates: [-73.9667, 40.78] }, $maxDistance: 10000, }, }, }; // Find documents based on our query const cursor = theaters.find(query);
Query dentro de um intervalo
O operador $geoWithin seleciona documentos com dados geoespaciais que existem dentro de uma forma especificada. O exemplo a seguir pesquisa cinemas na área de Nova Inglaterra:
// Find theaters within a specific geographic range async function range(theaters) { // Define the query to find theaters within a specified polygon const query = { "location.geo": { $geoWithin: { $geometry: { type: "Polygon", coordinates: [ [ [-72, 40], // Polygon coordinates defining the range [-74, 41], [-72, 39], [-72, 40], ], ], }, }, }, }; // Find documents based on our query const cursor = theaters.find(query);
Consulte a página manual do MongoDB Server em operadores de consulta geoespacial para mais informações sobre os operadores que você pode utilizar em sua consulta.