Docs Menu
Docs Home
/ /

Indexes

En esta guía, puede aprender a utilizar índices con el controlador Java de MongoDB.

Los índices facilitan la ejecución eficiente de consultas en MongoDB. Sin índices, MongoDB debe escanear todos los documentos de una colección (un escaneo de colección) para encontrar los documentos que coinciden con cada consulta. Estos escaneos de colección son lentos y pueden afectar negativamente el rendimiento de la aplicación. Si existe un índice adecuado para una consulta, MongoDB puede usarlo para limitar los documentos que debe inspeccionar.

Índices también:

  • Permitir una clasificación eficiente

  • Habilitar capacidades especiales como búsquedageoespacial

  • Permitir agregar restricciones para garantizar que un valor de campo sea único

  • Y más

Tip

Los índices también se utilizan en operaciones de actualización al buscar los documentos que se van a actualizar, en operaciones de eliminación al buscar los documentos que se van a eliminar y en determinadas etapas del proceso de agregación.

Cuando ejecuta una consulta en MongoDB, su comando puede incluir varios elementos:

  • Criterios de consulta que especifican los campos y valores que estás buscando

  • Opciones que afectan la ejecución de la consulta, como la preocupación de lectura

  • Criterios de proyección para especificar los campos que devuelve MongoDB (opcional)

  • Criterios de ordenación para especificar el orden de los documentos devueltos desde MongoDB (opcional)

Cuando todos los campos especificados en la consulta, proyección y ordenación están en el mismo índice, MongoDB devuelve resultados directamente desde el índice, también llamado consulta cubierta.

Importante

Orden de clasificación

Los criterios de ordenación deben coincidir o invertir el orden del índice.

Considere un índice en el campo name en orden ascendente (AZ) y age en orden descendente (9-0):

name_1_age_-1

MongoDB utiliza este índice cuando ordena sus datos mediante:

  • name ascendente, age descendente

  • name descendente, age ascendente

Especificando un orden de clasificación de name y age ascendente o name y age descendente requiere una ordenación en memoria.

Para obtener más información sobre cómo garantizar que su índice cubra sus criterios de consulta y proyección, consulte los artículos del manual de MongoDB sobre cobertura de consultas.

Para mejorar el rendimiento de las queries, cree índices en campos que aparezcan frecuentemente en las queries de su aplicación y en operaciones que devuelvan resultados ordenados. Cada índice que agregues consume espacio en disco y memoria cuando está activo, así que recomendamos que rastrees el uso de memoria y disco por parte del índice para la planificación de la capacidad. Además, cuando una operación de escritura actualiza un campo indexado, MongoDB actualiza el índice relacionado.

Dado que MongoDB admite esquemas dinámicos, las aplicaciones pueden realizar consultas sobre campos cuyos nombres se desconocen de antemano o son arbitrarios. MongoDB 4.2 introdujo índices comodín para facilitar estas consultas. Los índices comodín no están diseñados para reemplazar la planificación de índices basada en la carga de trabajo.

Para obtener más información sobre el diseño de tu modelo de datos y la elección de índices apropiados para tu aplicación, consulte el modelado de datos e índices del MongoDB Server.

MongoDB admite varios tipos de índices para facilitar la consulta de datos. Las siguientes secciones describen los tipos de índice más comunes y proporcionan código de ejemplo para crear cada uno. Para obtener una lista completa de los tipos de índice, consulte Índices.

Tip

El controlador Java de MongoDB proporciona los índices clase que incluye métodos de fábrica estáticos para crear documentos de especificación de índice para diferentes tipos de claves de índice MongoDB.

Los siguientes ejemplos utilizan el método createIndex() para crear varios índices y la siguiente configuración:

import com.mongodb.DuplicateKeyException;
import com.mongodb.MongoCommandException;
import com.mongodb.client.*;
import com.mongodb.client.model.IndexOptions;
import com.mongodb.client.model.Indexes;
import com.mongodb.client.model.Sorts;
import com.mongodb.client.model.geojson.Point;
import com.mongodb.client.model.geojson.Position;
import org.apache.log4j.BasicConfigurator;
import org.bson.Document;
import org.bson.conversions.Bson;
import static com.mongodb.client.model.Filters.*;
import static com.mongodb.client.model.Projections.*;
final String uri = "mongodb+srv://<atlas-uri>/<dbname>?retryWrites=true&w=majority";
mongoClient = MongoClients.create(uri);
database = mongoClient.getDatabase("sample_mflix");
collection = database.getCollection("movies");

Los índices de campo único son índices que hacen referencia a un solo campo dentro de los documentos de una colección. Mejoran el rendimiento de las consultas y la ordenación de campos únicos, y son compatibles con los índices TTL, que eliminan automáticamente los documentos de una colección después de un tiempo determinado o en una hora específica.

Nota

El índice _id_ es un ejemplo de índice de campo único. Este índice se crea automáticamente en el campo _id al crear una nueva colección.

El siguiente ejemplo crea un índice en orden ascendente en el campo title:

String resultCreateIndex = collection.createIndex(Indexes.ascending("title"));
System.out.println(String.format("Index created: %s", resultCreateIndex));

El siguiente es un ejemplo de una consulta que está cubierta por el índice creado en el fragmento de código anterior:

Bson filter = eq("title", "Batman");
Bson sort = Sorts.ascending("title");
Bson projection = fields(include("title"), excludeId());
FindIterable<Document> cursor = collection.find(filter).sort(sort).projection(projection);

Para obtener más información, consulte Índices de campo único en el manual de MongoDB Server.

Los índices compuestos contienen referencias a múltiples campos dentro de los documentos de una colección, lo que mejora el rendimiento de las consultas y la clasificación.

Tip

Lee más sobre índices compuestos, prefijos de índice y orden de clasificación aquí.

El siguiente ejemplo crea un índice compuesto en los campos type y rated:

String resultCreateIndex = collection.createIndex(Indexes.ascending("type", "rated"));
System.out.println(String.format("Index created: %s", resultCreateIndex));

El siguiente es un ejemplo de una consulta que está cubierta por el índice creado en el fragmento de código anterior:

Bson filter = and(eq("type", "movie"), eq("rated", "G"));
Bson sort = Sorts.ascending("type", "rated");
Bson projection = fields(include("type", "rated"), excludeId());
FindIterable<Document> cursor = collection.find(filter).sort(sort).projection(projection);

Para obtener más información, consulte Índices compuestos en el manual de MongoDB Server.

Los índices multiclave mejoran el rendimiento de las consultas que especifican un campo con un índice que contiene un valor de matriz. Se puede definir un índice multiclave con la misma sintaxis que un índice de campo único o compuesto.

El siguiente ejemplo crea un índice compuesto de múltiples claves en los campos rated, genres (una matriz de cadenas) y title:

String resultCreateIndex = collection.createIndex(Indexes.ascending("rated", "genres", "title"));
System.out.println(String.format("Index created: %s", resultCreateIndex));

El siguiente es un ejemplo de una consulta que está cubierta por el índice creado en el fragmento de código anterior:

Bson filter = and(eq("genres", "Animation"), eq("rated", "G"));
Bson sort = Sorts.ascending("title");
Bson projection = fields(include("title", "rated"), excludeId());
FindIterable<Document> cursor = collection.find(filter).sort(sort).projection(projection);

Los índices multiclave se comportan de forma diferente a otros índices en cuanto a la cobertura de consultas, el cálculo de los límites de índice y el ordenamiento. Para obtener más información sobre los índices multiclave, incluyendo una explicación de su comportamiento y limitaciones, consulte la página Índices multiclave del manual de MongoDB.

Puede administrar mediante programación sus índices MongoDB Search y MongoDB Vector Search utilizando el controlador Java.

La función de búsqueda de MongoDB permite realizar búsquedas de texto completo en colecciones alojadas en MongoDB Atlas. Para obtener más información sobre la búsqueda de MongoDB, consulte la documentación de los índices de búsqueda de MongoDB.

La Búsqueda Vectorial de MongoDB permite realizar búsquedas semánticas en incrustaciones vectoriales almacenadas en MongoDB Atlas. Para obtener más información sobre la Búsqueda Vectorial de MongoDB, consulte Guíade búsqueda vectorial de MongoDB.

Puede llamar a los siguientes métodos en una colección para administrar sus índices de búsqueda vectorial y de búsqueda de MongoDB:

  • createSearchIndex() (válido solo para índices de búsqueda de MongoDB)

  • createSearchIndexes()

  • listSearchIndexes()

  • updateSearchIndex()

  • dropSearchIndex()

Nota

Los métodos de gestión de índices de búsqueda de MongoDB se ejecutan de forma asíncrona. Los métodos del controlador pueden regresar antes de confirmar su correcta ejecución. Para determinar el estado actual de los índices, llame al método listSearchIndexes().

Las siguientes secciones proporcionan ejemplos de código que demuestran cómo utilizar cada uno de los métodos anteriores.

Puede usar el método createSearchIndex() para crear un índice de búsqueda de MongoDB. No puede usar este método para crear un índice de búsqueda vectorial.

El siguiente ejemplo de código muestra cómo crear un índice de búsqueda de MongoDB:

Document searchIdx = new Document("mappings",
new Document("dynamic", true));
collection.createSearchIndex("myIndex", searchIdx);

Puede usar el método createSearchIndexes() para crear varios índices de búsqueda de MongoDB o uno o más índices de búsqueda vectorial. Debe crear y pasar una instancia de SearchIndexModel para cada índice.

El siguiente ejemplo de código muestra cómo crear índices de búsqueda y búsqueda vectorial en una sola llamada:

SearchIndexModel searchIdxMdl = new SearchIndexModel(
"searchIdx",
new Document("analyzer", "lucene.standard").append(
"mappings", new Document("dynamic", true)),
SearchIndexType.search()
);
SearchIndexModel vectorSearchIdxMdl = new SearchIndexModel(
"vsIdx",
new Document(
"fields",
Arrays.asList(
new Document("type", "vector")
.append("path", "embeddings")
.append("numDimensions", 1536)
.append("similarity", "dotProduct")
)
),
SearchIndexType.vectorSearch()
);
collection.createSearchIndexes(
Arrays.asList(searchIdxMdl, vectorSearchIdxMdl)
);

Puede utilizar el método listSearchIndexes() para devolver los índices de búsqueda de MongoDB de una colección.

El siguiente ejemplo de código muestra cómo imprimir una lista de los índices de búsqueda de una colección:

try (MongoCursor<Document> resultsCursor = collection.listSearchIndexes().iterator()) {
while (resultsCursor.hasNext()) {
System.out.println(resultsCursor.next());
}
}

Puede utilizar el método updateSearchIndex() para actualizar un índice de búsqueda de MongoDB.

El siguiente código muestra cómo actualizar un índice de búsqueda:

collection.updateSearchIndex("myIndex",
new Document("analyzer", "lucene.simple").append(
"mappings",
new Document("dynamic", false)
.append("fields",
new Document("title",
new Document("type", "string")))
)
);

Puede utilizar el método dropSearchIndex() para eliminar un índice de búsqueda de MongoDB.

El siguiente código muestra cómo eliminar un índice de búsqueda de una colección:

collection.dropSearchIndex("myIndex");

Los índices de texto admiten consultas de texto sobre contenido de cadena. Estos índices pueden incluir cualquier campo cuyo valor sea una cadena o un array de elementos de cadena. MongoDB admite consultas de texto en varios idiomas. Puede especificar el idioma predeterminado al crear el índice.

Tip

MongoDB ofrece una solución mejorada de búsqueda de texto completo: MongoDB Search. Para obtener más información sobre los índices de MongoDB Search y cómo usarlos, consulte la sección "Índices de MongoDB Search y de búsqueda vectorial" de esta guía.

El siguiente ejemplo crea un índice de texto en el campo plot:

try {
String resultCreateIndex = collection.createIndex(Indexes.text("plot"));
System.out.println(String.format("Index created: %s", resultCreateIndex));
// Prints a message if a text index already exists with a different configuration
} catch (MongoCommandException e) {
if (e.getErrorCodeName().equals("IndexOptionsConflict"))
System.out.println("there's an existing text index with different options");
}

A continuación, se muestra un ejemplo de consulta que utiliza el índice creado en el fragmento de código anterior. Tenga en cuenta que se omite el sort porque los índices de texto no contienen orden de clasificación.

Bson filter = text("java coffee shop");
Bson projection = fields(include("fullplot"), excludeId());
FindIterable<Document> cursor = collection.find(filter).projection(projection);

Una colección solo puede contener un índice de texto. Si desea crear un índice de texto para varios campos de texto, debe crear un índice compuesto. Una consulta de texto se ejecuta en todos los campos de texto dentro del índice compuesto.

El siguiente fragmento crea un índice de texto compuesto para los campos title y genre:

collection.createIndex(Indexes.compoundIndex(Indexes.text("title"), Indexes.text("genre")));

Para obtener más información, consulte las siguientes entradas del Manual del servidor:

MongoDB admite consultas de datos de coordenadas geoespaciales mediante 2índices dsphere. Con un 2dsphere índice, puede consultar los datos geoespaciales por inclusión, intersección y proximidad. Para obtener más información sobre cómo consultar datos geoespaciales, consulte Consultas geoespaciales.

Para crear un 2dsphere índice, debe especificar un campo que contenga únicamente objetos GeoJSON. Para obtener más información sobre este tipo, consulte la página del manual de MongoDB Server sobre objetos GeoJSON.

El campo location.geo en el siguiente documento de muestra de la colección theaters en la base de datos sample_mflix es un objeto Punto GeoJSON que describe las coordenadas del teatro:

{
"_id" : ObjectId("59a47286cfa9a3a73e51e75c"),
"theaterId" : 104,
"location" : {
"address" : {
"street1" : "5000 W 147th St",
"city" : "Hawthorne",
"state" : "CA",
"zipcode" : "90250"
},
"geo" : {
"type" : "Point",
"coordinates" : [
-118.36559,
33.897167
]
}
}
}

El siguiente ejemplo crea un índice 2dsphere en el campo location.geo:

Importante

Intentar crear un índice geoespacial en un campo que está cubierto por un índice geoespacial genera un error.

try {
String resultCreateIndex = collection.createIndex(Indexes.geo2dsphere("location.geo"));
System.out.println(String.format("Index created: %s", resultCreateIndex));
// Prints a message if a geospatial index already exists with a different configuration
} catch (MongoCommandException e) {
if (e.getErrorCodeName().equals("IndexOptionsConflict"))
System.out.println("there's an existing geospatial index with different options");
}

El siguiente es un ejemplo de una consulta geoespacial que utiliza el índice "location.geo".

// Stores the coordinates of the NY MongoDB headquarters
Point refPoint = new Point(new Position(-73.98456, 40.7612));
// Retrieves documents that represent locations up to 1000 meters from the specified point directly from the geospatial index
// Creates a filter to match a document
Bson filter = near("location.geo", refPoint, 1000.0, 0.0);
FindIterable<Document> cursor = collection.find(filter);

MongoDB también admite 2d índices para calcular distancias en un plano euclidiano y para trabajar con la sintaxis de "pares de coordenadas heredados" utilizada en MongoDB 2.2 y versiones anteriores. Para más información, consulte la página Consultas geoespaciales del manual de MongoDB Server.

Los índices únicos garantizan que los campos indexados no almacenen valores duplicados. De forma predeterminada, MongoDB crea un índice único en el campo _id durante la creación de una colección. Para crear un índice único, especifique el campo o la combinación de campos que desea evitar la duplicación y configure la opción unique como true.

El siguiente ejemplo crea un índice descendente único en el campo theaterId:

try {
IndexOptions indexOptions = new IndexOptions().unique(true);
String resultCreateIndex = collection.createIndex(Indexes.descending("theaterId"), indexOptions);
System.out.println(String.format("Index created: %s", resultCreateIndex));
// Prints a message if the "theaterID" field contains duplicate values
} catch (DuplicateKeyException e) {
System.out.printf("duplicate field values encountered, couldn't create index: \t%s\n", e);
}

Importante

Si realiza una operación de escritura que almacena un valor duplicado que viola el índice único, el controlador Java de MongoDB genera un DuplicateKeyException y MongoDB arroja un error similar al siguiente:

E11000 duplicate key error index

Para obtener más información, consulte la página Índices únicos en el manual de MongoDB Server.

Los índices comodín permiten realizar consultas sobre campos desconocidos o arbitrarios. Estos índices pueden ser beneficiosos si se utiliza un esquema dinámico.

El siguiente ejemplo crea un índice comodín ascendente en todos los valores del campo location, incluidos los valores anidados en subdocumentos y matrices:

String resultCreateIndex = collection.createIndex(Indexes.ascending("location.$**"));
System.out.println(String.format("Index created: %s", resultCreateIndex));

Para obtener más información, consulte la página Índices comodín en el manual de MongoDB Server.

Los índices agrupados indican a una colección que almacene documentos ordenados por un valor de clave. Para crear un índice agrupado, especifique la opción de índice agrupado con el _id campo como clave y el campo único al true crear la colección.

El siguiente ejemplo crea un índice agrupado en el campo _id de la colección vendors:

MongoDatabase database = mongoClient.getDatabase("tea");
ClusteredIndexOptions clusteredIndexOptions = new ClusteredIndexOptions(new Document("_id", 1), true);
CreateCollectionOptions createCollectionOptions = new CreateCollectionOptions().clusteredIndexOptions(clusteredIndexOptions);
database.createCollection("vendors", createCollectionOptions);

Consulte las secciones del manual del servidor MongoDB para obtener más información:

Puede eliminar cualquier índice no utilizado excepto el índice único predeterminado en el campo _id.

Las siguientes secciones muestran las formas de remover índices:

  • Uso de un documento de especificación de índice

  • Uso de un campo de nombre indexado

  • Usando un carácter comodín para eliminar todos los índices

Pase un documento de especificación del índice al método dropIndex() para remover un índice de una colección. Un documento de especificación del índice es una instancia de Bson que especifica el tipo de índice en un campo determinado.

El siguiente fragmento elimina un índice ascendente en el campo title de una colección:

collection.dropIndex(Indexes.ascending("title"));

Importante

Si desea eliminar un índice de texto, debe usar su nombre. Consulte la sección "Eliminar un índice mediante un campo de nombre" para obtener más información.

Pase el campo name del índice al método dropIndex() para eliminar un índice de una colección.

Para encontrar el nombre de su índice, utilice el método listIndexes() para ver el valor de los campos name en sus índices.

El siguiente fragmento recupera e imprime todos los índices de una colección:

collection.listIndexes().forEach(doc -> System.out.println(doc.toJson()));

Si llama a listIndex() en una colección que contiene un índice de texto, la salida podría parecerse a la siguiente:

{ "v": 2, "key": {"_id": 1}, "name": "_id_" }
{ "v": 2, "key": {"_fts": "text", "_ftsx": 1}, "name": "title_text", "weights": {"title": 1},
"default_language": "english", "language_override": "language", "textIndexVersion": 3 }

Esta salida nos dice que los nombres de los índices existentes son "_id" y "title_text".

El siguiente fragmento elimina el índice "title_text" de la colección:

collection.dropIndex("title_text");

Nota

No se puede eliminar un solo campo de un índice de texto compuesto. Debe eliminar todo el índice y crear uno nuevo para actualizar los campos indexados.

A partir de MongoDB 4.2, puede eliminar todos los índices llamando al método dropIndexes() en su colección:

collection.dropIndexes();

Para versiones anteriores de MongoDB, pase "*" como parámetro a su llamada a dropIndex() en su colección:

collection.dropIndex("*");

Para obtener más información sobre los métodos de esta sección, consulte la siguiente documentación de API:

Volver

Colecciones de series de tiempo