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():
await 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():
await db.shipwrecks.createIndex({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.