Overview
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.
Cobertura y rendimiento de las consultas
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.
Consideraciones operativas
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.
Índices de listas
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); }
Tipos de índice
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.
Índices de un solo campo
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.
Índices compuestos
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.
Índices multiclave (índices en campos de matriz)
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.
Índices agrupados
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.
Text Indexes
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
texten los campostitleybodyen la colecciónblogPostsEspecifique
englishcomo idioma predeterminadoDefinir el peso del campo de
bodya10y detitlea3
// 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.
Índices geoespaciales
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.
Unique Indexes
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.
Índices de búsqueda de MongoDB y búsqueda vectorial de MongoDB
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.
Crear un índice de búsqueda
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);
Índices de búsqueda de listas
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); }
Actualizar un índice de búsqueda
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);
Eliminar un índice de búsqueda
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");