Overview
Un índice de 2dsphere admite consultas que calculan geometrías en una esfera similar a la Tierra. El índice 2dsphere soporta todas las consultas geoespaciales de MongoDB: consultas de inclusión, intersección y proximidad. Para obtener más información sobre las consultas geoespaciales, consulte
Consultas geoespaciales.
El 2dsphere índice admite datos almacenados como objetos GeoJSON y pares de coordenadas heredados (véase también 2dsphere Restricciones de campos indexados). Para los pares de coordenadas heredados, el índice convierte los datos a GeoJSON.Point
Versiones
2dsphere Versión del Índice | Descripción |
|---|---|
Versión 3 | MongoDB 3.2 introduce una versión 3 de los índices |
Versión 2 | MongoDB 2.6 introduce la versión 2 de los índices |
Para anular la versión predeterminada y especificar una versión diferente, incluya la opción { "2dsphereIndexVersion": <version> } al crear el índice.
sparse Propiedad
A partir de la versión 2, los índices 2dsphere son siempre dispersos e ignoran la opción disperso. Si un documento carece de un campo de índice 2dsphere (o el campo es null o un arreglo vacío), MongoDB no adiciona una entrada para el documento en el índice. Para inserciones, MongoDB inserta el documento pero no lo añade al índice 2dsphere.
Para un índice compuesto que incluye un índice clave 2dsphere junto con índices de otros tipos, sólo el campo índice 2dsphere determina si el índice hace referencia a un documento.
Las versiones anteriores de MongoDB solo admiten índices 2dsphere (Version 1). Los índices 2dsphere (Version 1) no son dispersos por defecto y rechazarán los documentos con campos de ubicación null.
Objetos GeoJSON adicionales
Los índices de la versión 2 y posteriores 2dsphere admiten objetos GeoJSONMultiPoint adicionales:,, y. Para obtener más información sobre todos los objetos GeoJSON compatibles, MultiLineString MultiPolygon GeometryCollectionconsulte Objetos GeoJSON.
Considerations
geoNear y $geoNear restricciones
Puedes especificar una opción key en la $geoNear etapa de la pipeline para indicar la ruta de campo indexado a usar. Esto permite que la etapa $geoNear se utilice en una colección que tenga múltiples índices 2dsphere y/o múltiples índices 2d:
Si su colección tiene varios
2dsphereíndices y/o varios índices 2d, debe usar lakeyopción para especificar la ruta del campo indexado a utilizar.Si no especifica el
key, no puede tener múltiples índices2dspherey/o varios índices 2d ya que, sin elkey, la selección de índices entre múltiples índices2do índices2dsphereresulta ambigua.
Nota
Si no se especifica el key, y se tiene como máximo solo un índice 2dsphere y/o solo un índice 2d, MongoDB buscará primero un índice 2d para usar. Si no existe un índice 2d, entonces MongoDB busca un índice 2dsphere para usar.
Restricciones de la clave de fragmento
No se puede usar un 2dsphere índice como clave de fragmento al fragmentar una colección. Sin embargo, se puede crear un índice geoespacial en una colección fragmentada usando un campo diferente como clave de fragmento.
2dsphere Restricciones de campos indexados
Los campos con índices 2dsphere deben contener datos geométricos en forma de pares de coordenadas o datos en formato GeoJSON. Si intentas insertar un documento con datos que no sean de geometría en un campo indexado 2dsphere, o compilar un índice 2dsphere en una colección donde el campo indexado tiene datos que no son de geometría, la operación fallará.
Número limitado de claves de índice
Para generar claves para un índice 2dsphere, mongod asigna formas GeoJSON a una representación interna. La representación interna resultante puede ser un gran arreglo de valores.
Cuando mongod genera claves de índice en un campo que contiene un arreglo, mongod genera una clave de índice para cada elemento del arreglo. Para los índices compuestos, mongod calcula el producto cartesiano de los conjuntos de claves que se generan para cada campo. Si ambos conjuntos son grandes, entonces calcular el producto cartesiano podría hacer que la operación exceda los límites de memoria.
indexMaxNumGeneratedKeysPerDocument limita el número máximo de claves generadas para un solo documento para prevenir errores de memoria insuficiente. El valor por defecto es de 100 000 claves de índice por documento. Es posible aumentar el límite, pero si una operación requiere más claves de las que el parámetro indexMaxNumGeneratedKeysPerDocument especifica, la operación fallará.
Crear un índice 2dsphere
Para crear un índice 2dsphere, utiliza el método db.collection.createIndex() y especifica el literal de cadena "2dsphere" como el 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 heredadas.
Nota
Si intenta crear un índice en un campo que contiene un arreglo de puntos geoJSON, la creación de índices falla y devuelve el siguiente error:
MongoServerError: Index build failed
A diferencia de un índice compuesto 2d que puede hacer referencia a un campo de ubicación y a otro campo, un 2dsphere índice compuesto puede hacer referencia a múltiples campos de ubicación y no ubicación.
Para los siguientes ejemplos, consideren una colección places con documentos que almacenen datos de ubicación como punto GeoJSON en un campo llamado loc:
db.places.insertMany( [ { loc : { type: "Point", coordinates: [ -73.97, 40.77 ] }, name: "Central Park", category : "Parks" }, { loc : { type: "Point", coordinates: [ -73.88, 40.78 ] }, name: "La Guardia Airport", category : "Airport" } ] )
Crear un índice 2dsphere
La siguiente operación crea un índice 2dsphere en el campo de ubicación loc:
db.places.createIndex( { loc : "2dsphere" } )
Crear un índice compuesto con 2dsphere clave índice
Un índice compuesto puede incluir una clave de índice 2dsphere en combinación con claves de índice no geoespaciales. Por ejemplo, la siguiente operación crea un índice compuesto donde la primera clave loc es una clave de índice 2dsphere, y las claves restantes category y names son claves de índice no geoespaciales, específicamente claves descendentes (-1) y ascendentes (1), respectivamente.
db.places.createIndex( { loc : "2dsphere" , category : -1, name: 1 } )
A diferencia del índice 2d, un índice 2dsphere compuesto no requiere que el campo de ubicación sea el primer campo indexado. Por ejemplo:
db.places.createIndex( { category : 1 , loc : "2dsphere" } )