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
/ /

Índices para la optimización de query

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 cada documento en una colección para encontrar los documentos que coincidan con cada query. Estos escaneos de colección son lentos y pueden afectar negativamente el rendimiento de la aplicación. Al utilizar un índice para limitar la cantidad de documentos que MongoDB analiza, las consultas pueden ser más eficientes y, por lo tanto, devolver resultados más rápido.

Cuando ejecutas una query contra MongoDB, tu query puede incluir tres partes:

  • Criterios de query que especifican uno o más campos y valores que estás buscando.

  • 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 quieres 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 asegurarte de que tu índice cubre tus criterios de query y proyección, consulta los artículos del manual de MongoDB sobre cobertura de la query y 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 para una colección. El método listIndexes() admite un 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 diferentes para admitir la consulta de tus datos. Las siguientes secciones describen los tipos de índices más comunes y proporcionan un código de muestra para crear cada tipo de índice.

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 usa el método createIndex() para crear un índice de orden ascendente en el campo title en 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 son índices que mejoran el rendimiento de las consultas que especifican un orden de clasificación ascendente o descendente para múltiples campos de un documento. Debes especificar la dirección (ascendente o descendente) para cada campo en el índice.

El siguiente ejemplo usa el método createIndex() para crear un índice compuesto en los campos type y genre en la colección movies de 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 multikey son índices que mejoran el rendimiento de las queries en campos que contienen valores de arreglos.

Puedes crear un índice multiclave en un campo con un valor de arreglo 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 multiclave 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 manera diferente a los índices que no son multiclave en términos de cobertura de consultas, cálculo de límites de índices y comportamiento de ordenación. Para obtener una explicación completa de los índices multiclave, incluidas una discusión sobre su comportamiento y limitaciones, consulta la página sobre índices multiclave en el manual del servidor de MongoDB.

Los índices agrupados mejoran el rendimiento de las operaciones de inserción, actualización y eliminación en colecciones con índice clusterizado. Las colecciones con índice clusterizado 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.

Índices de texto admiten queries de texto sobre el contenido de string. Estos índices pueden incluir cualquier campo cuyo valor sea una string o un arreglo de elementos de string.

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 saber más 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:

  • Crea 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, consulta Índices de Texto en el Manual del Servidor.

MongoDB es compatible con las consultas de datos de coordenadas geoespaciales mediante índices 2dsphere. Con un índice 2dsphere, puedes query los datos geoespaciales para la inclusión, intersección y proximidad. Para obtener más información sobre cómo consultar datos geoespacial con el driver de MongoDB Node.js, consulta nuestra Guía de búsqueda geoespacial.

Para crear un índice 2dsphere, debes especificar un campo que contenga solo objetos GeoJSON. Para obtener más detalles sobre este tipo, consulta 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 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 índices 2d 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, 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 aprender más, consulta Índices únicos.

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

MongoDB Vector Search te permite realizar búsquedas semánticas sobre embeddings vectoriales almacenados en Atlas. Para obtener más información sobre MongoDB Vector Search, consulta la documentación de MongoDB Vector Search.

Para obtener más información sobre cómo ejecutar una MongoDB Search o MongoDB Vector Search query, consulta la guía Ejecutar una MongoDB Search Query o Ejecutar una MongoDB Vector Search Query.

Las siguientes secciones contienen ejemplos de código que demuestran cómo gestionar 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 usar 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);

Cuando te conectes a MongoDB Server v6.0.11 y posteriores, puedes usar el driver para crear un índice MongoDB Vector Search 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 MongoDB Vector Search:

// 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);

Puedes 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 método listSearchIndexes() toma un parámetro de string opcional, name, para devolver solo los índices con nombres coincidentes. También toma un parámetro opcional aggregateOptions.

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);
}

Puedes usar el método updateSearchIndex() para actualizar un índice de MongoDB Search o MongoDB Vector Search proporcionando una nueva definición de índice.

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

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

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

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

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

Volver

Datos de Time Series