MongoDB admite operaciones de consulta en datos geoespaciales. Esta sección presenta las características geoespaciales de MongoDB.
En MongoDB, puede almacenar datos geoespaciales como objetos GeoJSON o como pares de coordenadas heredados .
Para calcular la geometría sobre una esfera similar a la Tierra, almacene sus datos de ubicación como objetos GeoJSON .
Para especificar datos de GeoJSON, use un documento incrustado con:
-
un campo llamado
type
que especifica el tipo de objeto GeoJSON y -
un campo llamado
coordinates
que especifica las coordenadas del objeto.Si especifica las coordenadas de latitud y longitud, enumere primero la longitud y luego la latitud :
- Los valores de longitud válidos están entre
-180
y180
, ambos inclusive. - Los valores de latitud válidos están entre
-90
y90
, ambos inclusive.
- Los valores de longitud válidos están entre
<field>: { type: <GeoJSON type> , coordinates: <coordinates> }
Por ejemplo, para especificar un punto GeoJSON :
location: {
type: "Point",
coordinates: [-73.856077, 40.848447]
}
Para obtener una lista de los objetos GeoJSON compatibles con MongoDB, así como ejemplos, consulte Objetos GeoJSON .
Las consultas geoespaciales de MongoDB sobre objetos GeoJSON se calculan en una esfera; MongoDB utiliza el sistema de referencia WGS84 para consultas geoespaciales sobre objetos GeoJSON.
Pares de coordenadas heredados
Para calcular distancias en un plano euclidiano, almacene sus datos de ubicación como pares de coordenadas heredados y use un 2d
índice. MongoDB admite cálculos de superficies esféricas en pares de coordenadas heredados a través de un 2dsphere
índice al convertir los datos al tipo de punto GeoJSON.
Para especificar datos como pares de coordenadas heredados, puede usar una matriz ( preferido ) o un documento incrustado.Especificar mediante una matriz ( preferido ):
<field>: [ <x>, <y> ]
Si especifica coordenadas de latitud y longitud, indique primero la longitud y luego la latitud ; es decir
<field>: [<longitude>, <latitude> ]
- Los valores de longitud válidos están entre
-180
y180
, ambos inclusive. - Los valores de latitud válidos están entre
-90
y90
, ambos inclusive.
Especificar a través de un documento incrustado:
<field>: { <field1>: <x>, <field2>: <y> }
Si especifica coordenadas de latitud y longitud, el primer campo, independientemente del nombre del campo, debe contener el valor de longitud y el segundo campo, el valor de latitud ; es decir
<field>: { <field1>: <longitude>, <field2>: <latitude> }
- Los valores de longitud válidos están entre
-180
y180
, ambos inclusive. - Los valores de latitud válidos están entre
-90
y90
, ambos inclusive.
Para especificar pares de coordenadas heredados, se prefieren las matrices sobre un documento incrustado, ya que algunos idiomas no garantizan el orden asociativo de mapas.
MongoDB proporciona los siguientes tipos de índices geoespaciales para respaldar las consultas geoespaciales.
Los índices de 2dsphere admiten consultas que calculan geometrías en una esfera similar a la tierra .
Para crear un 2dsphere
índice, use el db.collection.createIndex()
método y especifique el literal de cadena "2dsphere"
como tipo de índice:
db.collection.createIndex( { <location field> : "2dsphere" } )
donde <location field>
es un campo cuyo valor es un objeto GeoJSON o un par de coordenadas heredado .
Para obtener más información sobre el 2dsphere
índice, consulte 2dsphere
Índices .
Los índices 2D admiten consultas que calculan geometrías en un plano bidimensional . Aunque el índice puede admitir $nearSphere
consultas que calculan en una esfera, si es posible, utilice el 2dsphere
índice para consultas esféricas.
Para crear un 2d
índice, use el db.collection.createIndex()
método, especificando el campo de ubicación como clave y el literal de cadena "2d"
como tipo de índice:
db.collection.createIndex( { <location field> : "2d" } )
donde <location field>
es un campo cuyo valor es un par de coordenadas heredado .
Para obtener más información sobre el 2d
índice, consulte 2d
Índices .
No puede utilizar un índice geoespacial como clave de fragmentación al fragmentar una colección. Sin embargo, puede crear un índice geoespacial en una colección fragmentada utilizando un campo diferente como clave de fragmentación.
Las siguientes operaciones geoespaciales se admiten en colecciones fragmentadas:
$geoNear
etapa de agregación$near
y$nearSphere
operadores de consulta (a partir de MongoDB 4.0)
A partir de MongoDB 4.0, $near
y $nearSphere
las consultas se admite para colecciones fragmentados.
En versiones anteriores de MongoDB, las consultas $near
y las $nearSphere
colecciones fragmentadas no son compatibles; en su lugar, para los clústeres fragmentados, debe usar la $geoNear
etapa de agregación o el geoNear
comando (disponible en MongoDB 4.0 y versiones anteriores).
También puede consultar datos geoespaciales para un clúster fragmentado mediante $geoWithin
y $geoIntersects
.
Consultas cubiertas ¶
Los índices geoespaciales no pueden cubrir una consulta .
NOTA
Para consultas esféricas, use el 2dsphere
resultado del índice.
El uso de 2d
índice para consultas esféricas puede conducir a resultados incorrectos, como el uso del 2d
índice para consultas esféricas que envuelven los polos.
MongoDB proporciona los siguientes operadores de consultas geoespaciales:
Nombre | Descripción |
---|---|
$geoIntersects |
Selecciona geometrías que se cruzan con una geometría GeoJSON . El índice 2dsphere admite archivos $geoIntersects . |
$geoWithin |
Selecciona geometrías dentro de una geometría GeoJSON delimitante . Los índices 2dsphere y 2d son compatibles $geoWithin . |
$near |
Devuelve objetos geoespaciales próximos a un punto. Requiere un índice geoespacial. Los índices 2dsphere y 2d son compatibles $near . |
$nearSphere |
Devuelve objetos geoespaciales próximos a un punto de una esfera. Requiere un índice geoespacial. Los índices 2dsphere y 2d son compatibles $nearSphere . |
Para obtener más detalles, incluidos ejemplos, consulte la página de referencia individual.
MongoDB proporciona la siguiente etapa de canalización de agregación geoespacial :
Etapa | Descripción |
---|---|
$geoNear
|
Devuelve un flujo ordenado de documentos según la proximidad a un
punto geoespacial. Incorpora la funcionalidad de
|
Para obtener más detalles, incluidos ejemplos, consulte la $geoNear
página de referencia.
Las consultas geoespaciales de MongoDB pueden interpretar la geometría en una superficie plana o una esfera.
2dsphere
los índices solo admiten consultas esféricas (es decir, consultas que interpretan geometrías en una superficie esférica).
2d
los índices admiten consultas planas (es decir, consultas que interpretan geometrías en una superficie plana) y algunas consultas esféricas. Si bien los 2d
índices admiten algunas consultas esféricas, el uso de 2d
índices para estas consultas esféricas puede generar errores. Si es posible, utilice 2dsphere
índices para consultas esféricas.
La siguiente tabla enumera los operadores de consulta geoespacial, consulta admitida, utilizados por cada operación geoespacial:
Operación | Consulta esférica / plana | Notas |
---|---|---|
$near (
Punto de centroide GeoJSON en
esta línea y la línea siguiente, índice 2dsphere ) |
Esférico | Consulte también el $nearSphere operador,
que proporciona la misma funcionalidad cuando se usa con GeoJSON y
un índice 2dsphere . |
$near (
coordenadas heredadas, índice 2d ) |
Departamento | |
$nearSphere (
Punto GeoJSON ,
índice 2dsphere ) |
Esférico |
Proporciona la misma funcionalidad que la Para consultas esféricas, puede ser preferible utilizar |
$nearSphere (
coordenadas heredadas, índice 2d ) |
Esférico | Utilice puntos GeoJSON en su lugar. |
$geoWithin :
{ $geometry :
...} |
Esférico | |
$geoWithin :
{ $box :
...} |
Departamento | |
$geoWithin :
{ $polygon :
...} |
Departamento | |
$geoWithin :
{ $center :
...} |
Departamento | |
$geoWithin :
{ $centerSphere :
...} |
Esférico | |
$geoIntersects
|
Esférico | |
$geoNear etapa
de agregación ( índice 2dsphere ) |
Esférico | |
$geoNear etapa
de agregación ( índice 2d ) |
Departamento |
Crea una colección places
con los siguientes documentos:
db.places.insert( { name: "Central Park", location: { type: "Point", coordinates: [ -73.97, 40.77 ] }, category: "Parks"} );db.places.insert( { name: "Sara D. Roosevelt Park", location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] }, category: "Parks"} );db.places.insert( { name: "Polo Grounds", location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] }, category: "Stadiums"} );
La siguiente operación crea un 2dsphere
índice en el location
campo:
db.places.createIndex( { location: "2dsphere" } )
La siguiente consulta utiliza el $near
operador para devolver documentos que están al menos a 1000 metros y como máximo a 5000 metros del punto GeoJSON especificado, ordenados en orden de más cercano a más lejano:
db.places.find( { location: { $near: { $geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, $minDistance: 1000, $maxDistance: 5000 } } })
La siguiente operación utiliza la $geoNear
operación de agregación para devolver documentos que coinciden con el filtro de consulta { category: "Parks" }
, ordenados de más cerca a más lejos del punto GeoJSON especificado:
db.places.aggregate( [ { $geoNear: { near: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, spherical: true, query: { category: "Parks" }, distanceField: "calcDistance" } }] )