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

Crear y gestionar índices

En esta guía, puedes aprender cómo utilizar índices con el MongoDB .NET/C# Driver. Los índices pueden mejorar la eficiencia de las consultas y agregar funcionalidad al consultar y almacenar documentos.

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. Sin embargo, si existe un índice adecuado para una query, MongoDB puede utilizar el índice para limitar los documentos que debe inspeccionar.

Cuando ejecutas una query en MongoDB, tu query 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 el nivel de consistencia de lectura

  • Criterios de proyección para especificar los campos que deseas que MongoDB devuelva

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

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

Para obtener más información sobre cómo asegurarse de que su índice cubre sus criterios de query y proyección, consulte el query cubierta sección en el manual del servidor MongoDB.

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.

Dado que MongoDB admite esquemas dinámicos, las aplicaciones pueden realizar consultas en campos cuyos nombres no se conocen de antemano o son arbitrarios. Losíndices comodín facilitan estas consultas, pero 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 cómo diseñar su modelo de datos y elegir índices apropiados para su aplicación, consulte la documentación del servidor sobre Estrategias de indexación y Modelado de datos e índices.

MongoDB ofrece varios tipos de índices diferentes para soportar la consulta de tus datos. Los siguientes pasos describen el proceso para crear un índice:

  1. Usa el IndexKeysDefinitionBuilder<TDocument> Clase, a la que se puede acceder mediante la propiedad Builders<TDocument>.IndexKeys, para crear uno o más objetos IndexKeysDefinition<TDocument>. Estas definiciones clave describen el tipo de índice que se creará y sus demás propiedades.

  2. Crea un nuevo objeto CreateIndexModel<TDocument>. Pasa las definiciones de clave del paso anterior al constructor.

  3. Llama al método CreateOne() en la propiedad Indexes de tu colección. Pasa el objeto CreateIndexModel<TDocument> del paso anterior.

Las siguientes secciones describen los tipos de índices más comunes y proporcionan código de muestra para crear cada tipo de índice.

Nota

Los ejemplos de esta página utilizan las colecciones sample_mflix.movies y sample_mflix.theaters del Conjuntos de datos de muestra de Atlas. Para aprender cómo crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Introducción al controlador .NET/C#.

Los índices de campo único son índices con una referencia a un único campo dentro de los documentos de una colección. Mejoran la single field query y el rendimiento de la clasificación, además de soportar Índices TTL que remueven automáticamente los documentos de una colección después de cierto tiempo o en un momento específico del reloj.

Nota

El índice _id_ es un ejemplo de un índice de campo único. 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 dentro de la colección sample_mflix.movies:

var indexModel = new CreateIndexModel<Movie>(Builders<Movie>.IndexKeys.Ascending(m => m.Title));
collection.Indexes.CreateOne(indexModel);

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

// Define query parameters
var filter = Builders<Movie>.Filter.Eq(m => m.Title, "Batman");
var sort = Builders<Movie>.Sort.Ascending(m => m.Title);
var projection = Builders<Movie>.Projection.Include(m => m.Title).Exclude(m => m.Id);
// Execute query
var results = collection.Find(filter).Sort(sort).Project(projection);

Para obtener más información, consulta Índices de campo único en el manual del servidor.

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.

El siguiente ejemplo crea un índice compuesto en los campos type y rated de la colección sample_mflix.movies:

var indexModel = new CreateIndexModel<Movie>(Builders<Movie>.IndexKeys
.Ascending(m => m.Type)
.Ascending(m => m.Rated));
collection.Indexes.CreateOne(indexModel);

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

// Define query parameters
var typeFilter = Builders<Movie>.Filter.Eq(m => m.Type, "movie");
var ratedFilter = Builders<Movie>.Filter.Eq(m => m.Rated, "G");
var filter = Builders<Movie>.Filter.And(typeFilter, ratedFilter);
var sort = Builders<Movie>.Sort.Ascending(m => m.Type).Ascending(m => m.Rated);
var projection = Builders<Movie>.Projection
.Include(m => m.Type)
.Include(m => m.Rated)
.Exclude(m => m.Id);
// Execute query
var results = collection.Find(filter).Sort(sort).Project(projection);

Para más información, consulte Índices compuestos en el manual del servidor.

Los índices multiclave recopilan y ordenan datos de campos que contienen valores 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 y multinivel en los campos rated, genres (un arreglo de cadenas) y title dentro de la colección sample_mflix.movies:

var indexModel = new CreateIndexModel<Movie>(Builders<Movie>.IndexKeys
.Ascending(m => m.Rated)
.Ascending(m => m.Genres)
.Ascending(m => m.Title));
collection.Indexes.CreateOne(indexModel);

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

// Define query parameters
var genreFilter = Builders<Movie>.Filter.AnyEq(m => m.Genres, "Animation");
var ratedFilter = Builders<Movie>.Filter.Eq(m => m.Rated, "G");
var filter = Builders<Movie>.Filter.And(genreFilter, ratedFilter);
var sort = Builders<Movie>.Sort.Ascending(m => m.Title);
var projection = Builders<Movie>.Projection
.Include(m => m.Title)
.Include(m => m.Rated)
.Exclude(m => m.Id);
// Execute query
var results = collection.Find(filter).Sort(sort).Project(projection);

Los índices multiclave se comportan de manera diferente a otros índices en términos de cobertura de querys, cálculo de límites del índice y comportamiento de ordenamiento. Para obtener más información sobre los índices multiclave, incluidas discusiones sobre su comportamiento y limitaciones, consulta la página de Índices multiclave en el manual del servidor.

Los índices agrupados instruyen a una colección para almacenar documentos ordenados por un valor clave. Para crear un índice agrupado, especifique la opción de índice agrupado con el campo _id como clave y la propiedad Unique como true al crear su colección. Una colección solo puede contener un único índice agrupado. Para crear un índice agrupado, especifíquelo cuando cree una colección.

El siguiente ejemplo crea un índice agrupado en el campo _id mientras crea una nueva colección sample_mflix.reviews:

var database = mongoClient.GetDatabase("sample_mflix");
var clusteredIndexOptions = new ClusteredIndexOptions<Review>
{
Key = Builders<Review>.IndexKeys.Ascending(r => r.Id),
Unique = true
};
database.CreateCollection("reviews", new CreateCollectionOptions<Review>
{
ClusteredIndex = clusteredIndexOptions
});

Para obtener más información,consulte Índices agrupados y colecciones agrupadas en el manual del servidor.

Los índices de texto admiten consultas de búsqueda de texto en contenido de string. Estos índices pueden incluir cualquier campo cuyo valor sea un string o un arreglo de elementos de string. MongoDB admite búsqueda de texto para varios lenguajes. Puedes especificar el lenguaje por defecto como una opción 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 búsqueda de MongoDB y cómo usarlos, consulta la sección MongoDB Search y MongoDB Vector Search Indexes de esta guía.

Ten en cuenta que los índices de texto no pueden admitir consultas de búsqueda en MongoDB Search y que los índices de búsqueda en MongoDB Search no pueden admitir consultas de texto.

El siguiente ejemplo crea un índice de texto en el campo plot dentro de la colección sample_mflix.movies:

var indexModel = new CreateIndexModel<Movie>(Builders<Movie>.IndexKeys.Text(m => m.Plot));
collection.Indexes.CreateOne(indexModel);

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

// Define query parameters
var filter = Builders<Movie>.Filter.Text("java coffee shop");
var projection = Builders<Movie>.Projection.Include(m => m.Plot).Exclude(m => m.Id);
// Execute query
var results = collection.Find(filter).Project(projection);

Una colección solo puede contener un índice de texto. Para crear un índice de texto para varios campos de texto, debe crear un índice compuesto. Se ejecuta una búsqueda de texto en todos los campos de texto dentro del índice compuesto.

El siguiente snippet crea un índice de texto compuesto para los campos title y genre dentro de la colección sample_mflix.movies:

var indexModel = new CreateIndexModel<Movie>(Builders<Movie>.IndexKeys
.Text(m => m.Title)
.Text(m => m.Genre));
collection.Indexes.CreateOne(indexModel);

Para obtener más información, consulte Restricciones de índices de texto compuestos y Índices de texto en la guía del Servidor.

Puede consultar datos de coordenadas geoespaciales en MongoDB utilizando 2índices 2d o dsphere.

Los índices 2dsphere admiten queries geoespaciales en una esfera similar a la tierra. Al utilizar un índice 2dsphere, puedes query los datos geoespaciales para inclusión, intersección y proximidad. El campo indexado debe ser objetos GeoJSON o legacy coordinate pairs.

Para crear un índice 2dsphere, debes especificar un campo que contenga solo objetos GeoJSON. Para más detalles sobre este tipo, consulte Objetos GeoJSON en el manual del servidor MongoDB.

El campo location.geo en el siguiente documento de muestra de la colección sample_mflix.theaters es un punto GeoJSON que describe las coordenadas del cine:

{
"_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

El intento de crear un índice geoespacial en un campo que ya está cubierto por un índice geoespacial resulta en un error.

var indexModel = new CreateIndexModel<Theater>(Builders<Theater>.IndexKeys.Geo2DSphere(t => t.Location.Geo));
collection.Indexes.CreateOne(indexModel);

El siguiente es un ejemplo de una query geoespacial que utiliza la "ubicación.geo" índice:

// Stores the coordinates of the NY MongoDB headquarters
var refPoint = GeoJson.Point(GeoJson.Position(-73.98456, 40.7612));
// Creates a filter to match documents that represent locations up to 1000 meters from the specified point directly from the geospatial index
var filter = Builders<Theater>.Filter.Near(m => m.Location.Geo, refPoint, 1000.0, 0.0);
// Execute the query
var results = collection.Find(filter);

El controlador .NET/C# también incluye un Geo2D método para crear 2índices d. Puede usar estos índices para calcular distancias en un plano euclidiano y 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 en el manual del servidor.

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 los campos que desea evitar duplicaciones y configure la Unique opción true como.

El siguiente ejemplo crea un índice único en orden descendente en el campo theaterId dentro de la colección sample_mflix.theaters.

var options = new CreateIndexOptions { Unique = true };
var indexModel = new CreateIndexModel<Theater>(Builders<Theater>.IndexKeys.Descending(t => t.TheaterId),
options);
collection.Indexes.CreateOne(indexModel);

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, consulta Índices Únicos en el manual del servidor.

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

El siguiente ejemplo crea un índice comodín ascendente en todos los valores del campo location dentro de la colección sample_mflix.theaters, incluidos los valores anidados en subdocumentos y matrices:

var indexModel = new CreateIndexModel<Theater>(Builders<Theater>.IndexKeys.Wildcard(t => t.Location));
collection.Indexes.CreateOne(indexModel);

Para obtener más información, consulte la página Índices comodines en el manual del servidor.

Puedes utilizar el método List() para recuperar una lista de índices en tu colección.

El siguiente ejemplo utiliza el método List() para listar todos los índices en una colección:

var indexes = collection.Indexes.List();
foreach (var index in indexes.ToList())
{
Console.WriteLine(index);
}

Puede utilizar el método DropOne() para remover un solo índice de una colección. Para remover todos los índices de una colección, utiliza el método DropAll().

El siguiente ejemplo utiliza el método DropOne() para remover el índice "test_index" de una colección:

collection.Indexes.DropOne("test_index");

El siguiente ejemplo utiliza el método DropAll() para remover todos los índices de una colección:

collection.Indexes.DropAll();

Para obtener más información sobre las clases y métodos utilizados en esta página, consulte la siguiente documentación de API:

Volver

LINQ

En esta página