Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Indexes

En esta guía, puedes aprender cómo usar los í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 asegurar que el valor de un campo sea único

  • Y más

Tip

Los índices también son utilizados por las operaciones de actualización al buscar los documentos a actualizar, las operaciones de eliminación al buscar los documentos a eliminar y por ciertas etapas en el pipeline 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 buscas

  • Opciones que afectan la ejecución de la consulta, como el nivel de consistencia de lectura

  • Criterios de proyección para especificar los campos que MongoDB devuelve (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 clasificación deben coincidir o invertir el orden del índice.

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

name_1_age_-1

MongoDB utiliza este índice cuando ordenas tus datos por:

  • name ascendente, age descendente

  • name descendente, age ascendente

Especificar un orden de clasificación de name y age ascendente o name y age descendente requieren una clasificació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 consultar campos cuyos nombres no se conocen de antemano o son arbitrarios. MongoDB 4.2 introdujo los índices comodín para ayudar a admitir estas consultas. Los índices comodín no están diseñados para sustituir 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 diferentes para ayudar en la consulta de tus datos. Las siguientes secciones describen los tipos de índices más comunes y proporcionan código de muestra para crear cada tipo de índice. Para obtener una lista completa de los tipos de índices, 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 diversos í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");

Índices de campo único son índices con una referencia a un solo campo dentro de los documentos de una colección. Mejoran el rendimiento de las queries de campo único y de la ordenación, y admiten Índices TTL que remueven automáticamente documentos de una colección tras un período de tiempo determinado o en un horario definido.

Nota

El índice _id_ es un ejemplo de un índice de un solo campo. Este índice se crea automáticamente en el campo _id cuando se crea 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 query que está cubierta por el índice creado en el snippet 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, consulta Índices de un solo campo 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 query que está cubierta por el índice creado en el snippet 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, se puede consultar Índices compuestos en el manual de MongoDB Server.

Los índices multiclave son índices que mejoran el rendimiento de las queries que especifican un campo con un índice que contiene un valor de arreglo. Puedes definir un índice multiclave utilizando 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 query que está cubierta por el índice creado en el snippet 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.

Puedes gestionar programáticamente tus índices de MongoDB Search y MongoDB Vector Search utilizando el controlador de 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.

Puedes llamar a los siguientes métodos en una colección para gestionar tus índices de búsqueda y búsqueda vectorial de MongoDB:

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

  • createSearchIndexes()

  • listSearchIndexes()

  • updateSearchIndex()

  • dropSearchIndex()

Nota

los métodos de gestión del índice de búsqueda de MongoDB Search se ejecutan de manera asíncrona. Los métodos del controlador pueden devolver antes de confirmar que se ejecutaron correctamente. Para determinar el estado actual de los índices, llama al método listSearchIndexes().

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

Puedes usar el método createSearchIndex() para crear un índice de búsqueda en MongoDB Search. No puedes 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);

Puedes usar el método createSearchIndexes() para crear múltiples índices de búsqueda de MongoDB Search o uno o más índices de búsqueda de Vector Search. Debes 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)
);

Se puede usar el método listSearchIndexes() para devolver los índices de búsqueda de MongoDB Search 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());
}
}

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

Puedes usar el método dropSearchIndex() para remover un índice de MongoDB Search.

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, consulta la sección MongoDB Search y 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");
}

El siguiente es un ejemplo de query que utiliza el índice creado en el snippet de código anterior. Ten presente que el sort se omite 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 quieres crear un índice de texto para varios campos de texto, debes crear un índice compuesto. Una query 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 utilizando 2índices dsphere. Con un 2dsphere índice, puedes query los datos geoespaciales para inclusión, intersección y proximidad. Para obtener más información sobre cómo consultar datos geoespaciales, consulta Consultas geoespaciales.

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

El campo location.geo en el siguiente documento de ejemplo 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 ya está cubierto por un índice geoespacial resulta en 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 query geoespacial que utiliza la "ubicación.geo" índice.

// 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 "legacy coordinate pairs" utilizada en MongoDB 2.2 y anteriores. Para obtener más información, consulta la página de Consultas geoespaciales en el 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 guardar que almacena un valor duplicado que infringe el índice único, el driver de Java de MongoDB genera un DuplicateKeyException, y MongoDB genera un error similar al siguiente:

E11000 duplicate key error index

Para más información, consulta la página Índices Únicos en el manual del 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 de comodín ascendente en todos los valores del campo location, incluidos los valores anidados en subdocumentos y arreglos:

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

Para obtener más información, consulta 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 clusteringado 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);

Consulta las secciones del manual del servidor de MongoDB para más información:

Puedes remover cualquier índice no utilizado, excepto el índice único por defecto 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 snippet elimina un índice ascendente en el campo title de una colección:

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

Importante

Si quieres descartar un índice de texto, debes usar el nombre del índice en su lugar. Consulta la sección Remover un índice usando un campo Nombre para más detalles.

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

Para encontrar el nombre de tu índice, utiliza el método listIndexes() para ver el valor de los campos name en tus índices.

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

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

Si llamas 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 snippet remueve el índice "title_text" de la colección:

collection.dropIndex("title_text");

Nota

No puedes remover un solo campo de un índice de texto compuesto. Debes descartar el índice completo 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, pasa "*" como parámetro en tu llamada a dropIndex() en tu colección:

collection.dropIndex("*");

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

Volver

Colecciones de series de tiempo