Overview
En esta guía, aprenderá a usar índices con el controlador MongoDB .NET/C#. Los índices pueden mejorar la eficiencia de las consultas y añadir funcionalidad a la consulta y el almacenamiento de documentos.
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. Sin embargo, si existe un índice adecuado para una consulta, MongoDB puede usarlo para limitar los documentos que debe inspeccionar.
Cobertura y rendimiento de las consultas
Cuando ejecuta una consulta en MongoDB, su consulta 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 la preocupación de lectura
Criterios de proyección para especificar los campos que desea que MongoDB devuelva
Criterios de ordenación para especificar el orden de los documentos devueltos desde MongoDB
Cuando todos los campos especificados en la consulta, proyección y ordenación están en el mismo índice, MongoDB devuelve resultados directamente desde ese índice, también llamado consulta cubierta.
Para obtener más información sobre cómo garantizar que su índice cubra sus criterios de consulta y proyección, consulte la Sección de consultas cubiertas en el manual del servidor MongoDB.
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.
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.
Tipos de índice
MongoDB ofrece 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.
Nota
En este ejemplo se utiliza el sample_mflix.movies y colecciones sample_mflix.theaters de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte Inicio rápido.
Índices de un solo campo
Los índices de campo único son índices que hacen referencia a un solo campo dentro de los documentos de una colección. Mejoran el rendimiento de las consultas y la ordenación de campos únicos, y son compatibles con los índices TTL, que eliminan automáticamente los documentos de una colección después de un tiempo determinado o en una hora específica.
Nota
El índice _id_ es un ejemplo de índice de campo único. Este índice se crea automáticamente en el campo _id al crear 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 consulta que está cubierta por el índice creado en el fragmento 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.
Índices compuestos
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 consulta que está cubierta por el índice creado en el fragmento 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 obtener más información, consulte Índices compuestos en el manual del servidor.
Multikey Indexes
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 de múltiples claves en los campos rated, genres (una matriz 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 consulta que está cubierta por el índice creado en el fragmento 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 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 del servidor.
Índices agrupados
Los índices agrupados instruyen a una colección a almacenar documentos ordenados por un valor de clave. Para crear un índice agrupado, especifica la opción de índice agrupado con el campo _id como la clave y la propiedad Unique como true al crear tu colección. Una colección solo puede contener un único índice agrupado. Si quieres crear un índice agrupado, entonces debe especificarse al crear 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.
Índices de búsqueda de MongoDB
La función de búsqueda de MongoDB permite realizar búsquedas de texto completo en colecciones alojadas en MongoDB Atlas. Los índices especifican el comportamiento de la búsqueda y los campos a indexar.
Para obtener más información sobre MongoDB Search, consulte la documentación de Índices de búsqueda de MongoDB.
Nota
Los métodos de gestión de índices de búsqueda de MongoDB se ejecutan de forma asíncrona. Los métodos del controlador pueden regresar antes de confirmar su correcta ejecución. Para determinar el estado actual de los índices, llame al método IMongoSearchIndexManager.List().
Las siguientes secciones contienen enlaces a tutoriales que demuestran cómo crear e interactuar con índices de búsqueda de MongoDB.
Crear un índice de búsqueda
Antes de realizar una búsqueda en una colección de Atlas, debe crear un índice de búsqueda de MongoDB en la colección. Para aprender a crear un índice de búsqueda de MongoDB con el controlador .NET/C#,consulte "Crear un índice de búsqueda de MongoDB" en el manual de Atlas y seleccione C# desde el menú desplegable de idioma.
Índices de búsqueda de listas
Para aprender a ver una lista de sus índices de búsqueda de MongoDB usando el controlador .NET/C#, consulte Ver un índice de búsqueda de MongoDB en el manual de Atlas y seleccione en el C# menú desplegable de idioma.
Actualizar un índice de búsqueda
Para aprender a modificar un índice de búsqueda de MongoDB existente usando el controlador .NET/C#, consulte Editar un índice de búsqueda de MongoDB en el manual de Atlas y seleccione en el C# menú desplegable de idioma.
Eliminar un índice de búsqueda
Para aprender cómo eliminar un índice de búsqueda de MongoDB usando el controlador .NET/C#, consulte Eliminar un índice de búsqueda de MongoDB en el manual de Atlas y seleccione en el C# menú desplegable de idioma.
Text Indexes
Los índices de texto permiten realizar búsquedas de texto en cadenas. Estos índices pueden incluir cualquier campo cuyo valor sea una cadena o un array de elementos de cadena. MongoDB admite la búsqueda 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, consulte la sección "Índices de MongoDB Search" de esta guía.
Tenga en cuenta que los índices de texto no pueden admitir consultas de búsqueda de MongoDB, y los índices de búsqueda de MongoDB no pueden admitir consultas de texto.
Campo único
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 consulta utiliza el índice de texto creado en el fragmento de código 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);
Campos múltiples
Una colección solo puede contener un índice de texto. Si desea 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 fragmento 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 índice de texto compuesto e Í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 crear un 2índice dsphere, debe especificar un campo que contenga únicamente objetos GeoJSON. Para obtener más información sobre este tipo, consulte Objetos GeoJSON en el manual de MongoDB Server.
El campo location.geo en el siguiente documento de muestra de la colección sample_mflix.theaters 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 genera 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 consulta geoespacial que utiliza el índice "location.geo":
// 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);
MongoDB también admite 2d índices para calcular distancias en un plano euclidiano y trabajar con la sintaxis de "pares de coordenadas heredados". Para obtener más información, consulte Consultas geoespaciales en el manual del servidor.
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 los campos que desea evitar duplicaciones y configure la Unique opción true como.
El siguiente ejemplo crea un índice descendente único 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, consulte Índices únicos en el manual del servidor.
Índices comodín
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 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 comodín en el manual del servidor.
Índices de listas
Puede utilizar el método List() para recuperar una lista de índices en su colección.
El siguiente ejemplo utiliza el método List() para enumerar todos los índices de una colección:
var indexes = collection.Indexes.List(); foreach (var index in indexes.ToList()) { Console.WriteLine(index); }