O MongoDB suporta operações de consulta em dados geoespaciais. Esta seção introduz as feições geoespaciais do MongoDB.
Dados geoespaciais
No MongoDB, você pode armazenar dados geoespaciais como objetos GeoJSON ou como pares de coordenadas legadas.
Objetos GeoJSON
Para calcular a geometria sobre uma esfera semelhante à Terra, armazene seus dados de localização como Objetos GeoJSON.
Para especificar dados GeoJSON, utilize um documento incorporado com:
um campo denominado
typeque especifica o tipo de objeto GeoJSON eum campo chamado
coordinatesque especifica as coordenadas do objeto.
<field>: { type: <GeoJSON type> , coordinates: <coordinates> }
Importante
Se especificar coordenadas de latitude e longitude, liste a longitude primeiro e então 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.
Por exemplo, para especificar um Ponto GeoJSON:
location: { type: "Point", coordinates: [-73.856077, 40.848447] }
Para obter uma lista dos objetos GeoJSON compatíveis com o MongoDB, bem como exemplos, consulte Objetos GeoJSON.
Consultas geoespaciais do MongoDB em objetos GeoJSON calculam em uma esfera; o MongoDB usa o sistema de referência WGS84 para queries geoespaciais em objetos GeoJSON.
Pares de coordenadas legados
Use pares de coordenadas legado para cálculos planos (euclideanos) com um índice 2d Indexes. Para executar cálculos esféricos, converta pares legado em um GeoJSON Point e use um índice 2dsphere Indexes.
Para especificar dados como pares de coordenadas herdados, você pode usar uma array (preferencial) ou um documento incorporado.
- Array:
<field>: [ <x>, <y> ] Quando você usar longitude e latitude, liste primeiro a longitude e depois a latitude:
<field>: [ <longitude>, <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.
- documento incorporado :
<field>: { <field1>: <x>, <field2>: <y> } Se você utilizar longitude e latitude, o primeiro campo deverá ser longitude e o segundo deverá ser latitude:
<field>: { <field1>: <longitude>, <field2>: <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.
Use arrays para pares de coordenadas legado porque alguns idiomas não preservam a ordem dos campo de objeto .
Índices geoespaciais
Os índices geoespaciais suportam queries em dados armazenados como objetosGeoJSON do ou pares de coordenadas legado. Você pode utilizar índices geoespaciais para melhorar o desempenho para queries em dados geoespaciais ou para executar determinadas queries geoespaciais.
O MongoDB fornece dois tipos de índices geoespaciais:
Índices de esferas, que suportam queries que interpretam a geometria em uma esfera.
Índices 2D, que suportam queries que interpretam a geometria em uma superfície plana.
Para mais informações sobre índices geoespaciais, consulte Índices geoespaciais.
Consultas geoespaciais
Observação
Usar um índice 2d para queries sobre dados esféricos pode retornar resultados incorretos ou um erro. Por exemplo, índices 2d não suportam queries esféricas que envolvam em torno dos pólos.
Operadores de consulta geoespacial
O MongoDB fornece os seguintes operadores de query geoespacial: Para obter mais detalhes, incluindo exemplos, consulte as respectivas páginas de referência.
Nome | Descrição |
|---|---|
Seleciona geometrias que interseccionam com uma geometria GeoJSON. O índice 2dsphere suporta | |
Seleciona geometrias dentro de uma geometria GeoJSON delimitadora. Os índices 2dsphere e 2d suportam | |
Retorna objetos geoespaciais próximos a um ponto. Requer um índice geoespacial. Os índices | |
Retorna objetos geoespaciais próximos a um ponto em uma esfera. Requer um índice geoespacial. Os índices |
Observação
As coleções de séries temporais suportam apenas o estágio de agregação$geoNearpara classificar dados geoespaciais de consultas em relação a índices2dsphere. Você não pode usar os operadores $near e $nearSphere em coleções de séries temporais
Estágio de aggregation geoespacial
O MongoDB fornece o seguinte estágio de pipeline de agregaçãogeoespacial:
Estágio | Descrição |
|---|---|
Retorna um fluxo ordenado de documentos baseado na proximidade de um ponto geoespacial. Incorpora a funcionalidade do
|
Para mais detalhes, incluindo exemplos, consulte a página de referência do $geoNear.
Modelos geoespaciais
As consultas geoespaciais do MongoDB podem interpretar a geometria em uma superfície plana ou esfera.
2dsphere índices suportam apenas consultas esféricas (ou seja, consultas que
interpretar geometrias em uma superfície esférica).
2d os índices suportam queries simples (ou seja, queries que interpretam geometrias em uma superfície plana) e algumas queries esféricas. Enquanto índices do 2d suportam algumas queries esféricas, o uso de índices do 2d para estas queries esféricas pode resultar em erro. Se possível, use índices 2dsphere para queries esféricas.
A tabela seguinte lista os operadores de consulta geoespacial, consulta suportada, utilizados por cada operação geoespacial:
(operação) | Query esférica/plana | Notas |
|---|---|---|
| Esférica | Consulte também o |
Plana | ||
| Esférica | Fornece a mesma funcionalidade que operação Para queries esféricas, pode ser preferível utilizar o |
| Esférica | Use apontar GeoJSON . |
| Esférica | |
| Plana | |
| Plana | |
| Plana | |
| Esférica | |
Esférica | ||
| Esférica | |
| Plana |
Executar Queries Geoespaciais no Atlas
Exemplos
Crie uma collection places com os seguintes documentos:
db.places.insertMany( [ { name: "Central Park", location: { type: "Point", coordinates: [ -73.97, 40.77 ] }, category: "Parks" }, { name: "Sara D. Roosevelt Park", location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] }, category: "Parks" }, { name: "Polo Grounds", location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] }, category: "Stadiums" } ] )
A seguinte operação cria um índice 2dsphere no campo location:
db.places.createIndex( { location: "2dsphere" } )
A coleta places acima tem um índice 2dsphere. A query a seguir usa o operador $near para retornar documentos que estejam a pelo menos 1000 metros e no máximo 5000 metros do ponto GeoJSON especificado, classificados na ordem do mais próximo ao mais distante:
db.places.find( { location: { $near: { $geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, $minDistance: 1000, $maxDistance: 5000 } } } )
A operação a seguir usa a operação de aggregation $geoNear para retornar documentos que correspondem ao filtro de query { category:
"Parks" }, classificados na ordem do mais próximo ao mais distante do ponto GeoJSON especificado:
db.places.aggregate( [ { $geoNear: { near: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, spherical: true, query: { category: "Parks" }, distanceField: "calcDistance" } } ] )