Menu Docs
Página inicial do Docs
/ / /
Controlador Node.js
/ / /

Pesquisar geoespacialmente

Nesta página

  • Visão geral
  • Coordenadas em uma esfera semelhante à Terra
  • Coordenadas em um plano 2D
  • Exemplos
  • Query por proximidade
  • Query dentro de um intervalo

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:

  • Coordenadas em uma esfera semelhante à Terra

  • Coordenadas em um plano 2D

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.

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"});

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 servidor MongoDB em pares de coordenadas legados 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.

Os exemplos seguintes utilizam o conjunto de dados de amostra do MongoDB Atlas. Você pode aprender como configurar seu próprio Atlas cluster de camada grátis e como carregar o conjunto de dados de exemplo em nossoguia de início rápidodo .

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.

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);

O operador $geoWithin seleciona documentos com dados geoespaciais que existem dentro de uma forma especificada. O exemplo a seguir procura 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 servidor MongoDB em operadores de query geoespacial para mais informações sobre os operadores que você pode usar em sua query.

← Especifique quais campos retornar