Docs Menu
Docs Home
/ /

Índices para la optimización de consultas

Los índices son estructuras de datos que facilitan la ejecución eficiente de consultas en MongoDB. Contienen copias de partes de los datos de los documentos para optimizar las consultas.

Sin índices, MongoDB debe escanear todos los documentos de una colección para encontrar los que coinciden con cada consulta. Estos escaneos de colecciones son lentos y pueden afectar negativamente el rendimiento de la aplicación. Al usar un índice para limitar el número de documentos que MongoDB escanea, las consultas pueden ser más eficientes y, por lo tanto, obtener resultados más rápidos.

Cuando ejecuta una consulta en MongoDB, su consulta puede incluir tres partes:

  • Criterios de consulta que especifican uno o más campos y valores que está 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 desea que MongoDB devuelva (opcional)

Cuando todos los campos especificados en los criterios de consulta y la proyección de una consulta están indexados, MongoDB devuelve resultados directamente desde el índice sin escanear ningún documento de la colección ni cargarlos en la 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 e intersección de índices.

Para mejorar el rendimiento de las consultas, cree índices en los campos que aparecen con frecuencia en las consultas y operaciones de su aplicación que devuelven resultados ordenados. Cada índice que agregue consume espacio en disco y memoria cuando está activo, por lo que podría ser necesario realizar un seguimiento del uso de memoria y disco del índice para planificar la capacidad. Además, cuando una operación de escritura actualiza un campo indexado, MongoDB también actualiza el índice relacionado.

Para obtener más información sobre cómo diseñar su modelo de datos y elegir los índices adecuados para su aplicación, consulte la documentación del MongoDB Server sobre Estrategias de indexación y Modelado de datos e índices.

Puedes utilizar el listIndexes() Método para listar todos los índices de una colección. El método listIndexes() acepta el parámetro opcional ListIndexesOptions. El listIndexes() método devuelve un objeto de tipo ListIndexesCursor.

El siguiente código utiliza el método listIndexes() para enumerar todos los índices de una colección:

// List the indexes on the collection and output them as an array
const result = await collection.listIndexes().toArray();
// Print the list of indexes
console.log("Existing indexes:\n");
for(const doc in result){
console.log(doc);
}

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.

Los índices de un solo campo son índices que mejoran el rendimiento de las queries que especifican un orden de clasificación ascendente o descendente en un solo campo de un documento.

El siguiente ejemplo utiliza el método createIndex() para crear un índice de orden ascendente en el campo title de la colección movies de la base de datos sample_mflix.

const database = client.db("sample_mflix");
const movies = database.collection("movies");
// Create an ascending index on the "title" field in the
// "movies" collection.
const result = await movies.createIndex({ title: 1 });
console.log(`Index created: ${result}`);

A continuación se muestra un ejemplo de una query que está cubierta por el índice creado anteriormente.

// Define the query parameters
const query = { title: "Batman" }
const sort = { title: 1 };
const projection = { _id: 0, title: 1 };
// Execute the query using the defined parameters
const cursor = movies
.find(query)
.sort(sort)
.project(projection);
for await (const doc of cursor) {
console.log(doc);
}

Para obtener más información, consulte Índices de campo único.

Los índices compuestos mejoran el rendimiento de las consultas que especifican un orden ascendente o descendente para varios campos de un documento. Debe especificar la dirección (ascendente o descendente) para cada campo del índice.

El siguiente ejemplo utiliza el método createIndex() para crear un índice compuesto en los campos type y genre de la colección movies en la base de datos sample_mflix.

// Connect to the "sample_mflix" database
const database = client.db("sample_mflix");
// Access the database's "movies" collection
const movies = database.collection("movies");
// Create an ascending index on the "type" and "genre" fields
// in the "movies" collection.
const result = await movies.createIndex({ type: 1, genre: 1 });
console.log(`Index created: ${result}`);

A continuación se muestra un ejemplo de una query que está cubierta por el índice creado anteriormente.

// Define a query to find movies in the "Drama" genre
const query = { type: "movie", genre: "Drama" };
// Define sorting criteria for the query results
const sort = { type: 1, genre: 1 };
// Include only the type and genre fields in the query results
const projection = { _id: 0, type: 1, genre: 1 };
// Execute the query using the defined criteria and projection
const cursor = movies
.find(query)
.sort(sort)
.project(projection);
for await (const doc of cursor) {
console.log(doc);
}

Para obtener más información, consulte Índices compuestos.

Los índices multiclave son índices que mejoran el rendimiento de las consultas en campos que contienen valores de matriz.

Puede crear un índice multiclave en un campo con un valor de matriz llamando al método createIndex(). El siguiente código crea un índice ascendente en el campo cast de la colección movies de la base de datos sample_mflix:

const database = client.db("sample_mflix");
const movies = database.collection("movies");
// Create a multikey index on the "cast" field in the "movies" collection
const result = await movies.createIndex({ cast: 1 });

El siguiente código consulta el índice de claves múltiples para encontrar documentos en los que el valor del campo cast contiene "Viola Davis":

const query = { cast: "Viola Davis" };
const projection = { _id: 0, cast: 1 , title: 1 };
// Perform a find operation with the preceding filter and projection
const cursor = movies
.find(query)
.project(projection);
for await (const doc of cursor) {
console.log(doc);
}

Los índices multiclave se comportan de forma diferente a los índices sin multiclave en cuanto a la cobertura de consultas, el cálculo de los límites de índice y el comportamiento de ordenación. Para obtener una explicación completa de los índices multiclave, incluyendo su comportamiento y limitaciones, consulte la página "Índices multiclave" del manual de MongoDB Server.

Los índices agrupados mejoran el rendimiento de las operaciones de inserción, actualización y eliminación en colecciones agrupadas. Almacenan documentos ordenados por el valor de la clave del índice agrupado.

Para crear un índice agrupado, especifique la opción clusteredIndex en CollectionOption. La opción clusteredIndex debe especificar el campo _id como clave y el campo único como true.

El siguiente ejemplo utiliza el método createCollection() para crear un índice agrupado en el campo _id de la colección vendors de la base de datos tea.

const db = client.db('tea');
await db.createCollection('ratings', {
clusteredIndex: {
key: { _id: 1 },
unique: true
}
});

Para obtener más información, consulta Índices agrupados y colecciones con índice clusterizado.

Los índices de texto admiten consultas de texto sobre contenido de cadenas. Estos índices pueden incluir cualquier campo cuyo valor sea una cadena o una matriz de elementos de cadena.

MongoDB admite consultas de texto en varios idiomas, por lo que puede especificar el idioma predeterminado al crear el índice. También puede especificar una opción de ponderación para priorizar ciertos campos de texto en su índice. Estas ponderaciones indican la importancia de los campos en relación con los demás campos indexados.

Para obtener más información sobre las consultas de texto, consulte nuestra guía sobre consultas de texto.

El siguiente ejemplo utiliza el método createIndex() para realizar las siguientes acciones:

  • Cree un índice text en los campos title y body en la colección blogPosts

  • Especifique english como idioma predeterminado

  • Definir el peso del campo de body a 10 y de title a 3

// Get the database and collection on which to create the index
const myDB = client.db("testDB");
const myColl = myDB.collection("blogPosts");
// Create a text index on the "title" and "body" fields
const result = await myColl.createIndex(
{ title: "text", body: "text" },
{
default_language: "english",
weights: { body: 10, title: 3 }
}
);

La siguiente consulta utiliza el índice de texto creado en el código anterior:

// Query for documents where body or title contain "life ahead"
const query = { $text: { $search: "life ahead" } };
// Show only the title field
const projection = { _id: 0, title: 1 };
// Execute the find operation
const cursor = myColl.find(query).project(projection);
for await (const doc of cursor) {
console.log(doc);
}

Para obtener más información sobre los índices de texto, consulte Índices de texto en el manual del servidor.

MongoDB admite consultas de datos de coordenadas geoespaciales mediante 2índices dsphere. Con un 2índice dsphere, puede consultar los datos geoespaciales por inclusión, intersección y proximidad. Para obtener más información sobre cómo consultar datos geoespaciales con el controlador Node.js de MongoDB, consulte nuestra guía de búsqueda geoespacial.

Para crear un 2índice dsphere, 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 de 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 utiliza el método createIndexes() para crear un índice 2dsphere en el campo location.geo de la colección theaters de la base de datos sample_mflix para habilitar búsquedas geoespaciales.

const database = client.db("sample_mflix");
const movies = database.collection("movies");
/* Create a 2dsphere index on the "location.geo" field in the
"movies" collection */
const result = await movies.createIndex({ "location.geo": "2dsphere" });
// Print the result of the index creation
console.log(`Index created: ${result}`);

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 obtener más información, consulte Consultas geoespaciales.

Losíndices únicos garantizan que los campos indexados no almacenen valores duplicados. De forma predeterminada, MongoDB crea un índice único en el _id campo 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 unique opción true como.

El siguiente ejemplo utiliza el método createIndex() para crear un índice único en el campo theaterId en la colección theaters de la base de datos sample_mflix.

const database = client.db("sample_mflix");
const movies = database.collection("movies");
// Create a unique index on the "theaterId" field in the "theaters" collection.
const result = await movies.createIndex({ theaterId: 1 }, { unique: true });
console.log(`Index created: ${result}`);

Si intentas realizar una operación de escritura que almacene un valor duplicado que infrinja el índice único, MongoDB lanzará un error parecido al siguiente:

E11000 duplicate key error index

Para obtener más información, consulte Índices únicos.

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

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 la búsqueda de MongoDB.

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

Para obtener más información sobre cómo ejecutar una consulta de búsqueda MongoDB o una consulta de búsqueda vectorial MongoDB, consulte la guía Ejecutar una consulta de búsqueda MongoDB o Ejecutar una consulta de búsqueda vectorial MongoDB.

Las siguientes secciones contienen ejemplos de código que demuestran cómo administrar los índices de MongoDB Search y MongoDB Vector Search.

Puede utilizar los métodos createSearchIndex() y createSearchIndexes() para crear nuevos índices MongoDB Search y MongoDB Vector Search.

El siguiente código muestra cómo utilizar el método createSearchIndex() para crear un índice de búsqueda de MongoDB llamado search1:

// Creates a MongoDB Search index
const index1 = {
name: "search1",
definition: {
"mappings": {
"dynamic": true
}
}
}
await collection.createSearchIndex(index1);

Al conectarse a MongoDB Server v6.0.11 y versiones posteriores, puede usar el controlador para crear un índice de búsqueda vectorial de MongoDB especificando vectorSearch en el campo type de la definición del índice.

El siguiente código muestra cómo utilizar el método createSearchIndex() para crear un índice de búsqueda vectorial de MongoDB:

// Creates a MongoDB Vector Search index
const vectorSearchIdx = {
name: "vsidx1",
type: "vectorSearch",
definition: {
fields: [{
type: "vector",
numDimensions: 384,
path: "summary",
similarity: "dotProduct"
}]
}
}
await collection.createSearchIndex(vectorSearchIdx);

Puede usar el método listSearchIndexes() para devolver un cursor que contenga los índices de MongoDB Search y MongoDB Vector Search de una colección determinada. El listSearchIndexes() método acepta un parámetro de cadena opcional,, name para devolver solo los índices con nombres coincidentes. También acepta un parámetro opcional, addedOptions.

El siguiente código utiliza el método listSearchIndexes() para enumerar los índices MongoDB Search y MongoDB Vector Search en una colección:

// Lists search indexes
const result = await collection.listSearchIndexes().toArray();
console.log("Existing search indexes:\n");
for (const doc in result) {
console.log(doc);
}

Puede utilizar el método updateSearchIndex() para actualizar un índice de búsqueda MongoDB o de búsqueda vectorial MongoDB proporcionando una nueva definición de índice.

El siguiente código muestra cómo utilizar el método updateSearchIndex() para actualizar un índice de búsqueda de MongoDB llamado search1 para cambiar el tipo del campo description a una cadena:

// Updates a search index
const index2 = {
"mappings": {
"dynamic": true,
"fields": {
"description": {
"type": "string"
}
}
}
}
await collection.updateSearchIndex("search1", index2);

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

El siguiente código muestra cómo utilizar el método dropSearchIndex() para eliminar un índice llamado search1:

// Drops (deletes) a search index
await collection.dropSearchIndex("search1");

Volver

Datos de Time Series