Docs Menu
Docs Home
/ /

Indexes

En esta guía, aprenderá a usar índices con PyMongo. Los índices pueden mejorar la eficiencia de las consultas y añadir funcionalidad adicional 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.

Para mejorar el rendimiento de las queries, cree índices en campos que aparezcan frecuentemente en las queries de su aplicación y en operaciones que devuelvan resultados ordenados. Cada índice que agregues consume espacio en disco y memoria cuando está activo, así que recomendamos que rastrees el uso de memoria y disco por parte del índice para la planificación de la capacidad. Además, cuando una operación de escritura actualiza un campo indexado, MongoDB actualiza el índice relacionado.

Debido a que MongoDB admite esquemas dinámicos, las aplicaciones pueden realizar consultas sobre campos cuyos nombres no se conocen de antemano o son arbitrarios. Los índices comodín facilitan estas consultas. 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 guía Modelado de datos e índices en el manual de MongoDB Server.

Los ejemplos de esta guía utilizan el sample_mflix.movies Colección 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 Comience a utilizar PyMongo.

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. Seleccione el Synchronous o pestaña Asynchronous para ver el código correspondiente:

movies.create_index("title")
await movies.create_index("title")

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

query = { "title": "Batman" }
sort = [("title", 1)]
cursor = movies.find(query).sort(sort)

Para obtener más información, consulte Índices de campo único en el manual de MongoDB Server.

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 genre. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

movies.create_index([("type", pymongo.ASCENDING), ("genre", pymongo.ASCENDING)])
await movies.create_index([("type", pymongo.ASCENDING), ("genre", pymongo.ASCENDING)])

El siguiente es un ejemplo de una consulta que utiliza el índice creado en el ejemplo de código anterior:

query = { "type": "movie", "genre": "Drama" }
sort = [("type", pymongo.ASCENDING), ("genre", pymongo.ASCENDING)]
cursor = movies.find(query).sort(sort)

Para obtener más información, consulte Índices compuestos en el manual de MongoDB Server.

Los índicesmulticlave mejoran el rendimiento de las consultas que especifican un campo con un índice que contiene un valor de matriz. Puede definir un índice multiclave utilizando la misma sintaxis que un índice de campo único o compuesto. Seleccione Synchronous Asynchronous la pestaña o para ver el código correspondiente:

El siguiente ejemplo crea un índice modular en el campo cast. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:

result = movies.create_index("cast")
result = await movies.create_index("cast")

El siguiente es un ejemplo de una consulta que utiliza el índice creado en el ejemplo de código anterior:

query = { "cast": "Viola Davis" }
cursor = movies.find(query)

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 comportamiento de ordenación. Para obtener más información sobre los índices multiclave, incluyendo una explicación de su comportamiento y limitaciones, consulte la guía de índices multiclave en el manual de MongoDB Server.

Puedes administrar tus índices de búsqueda de MongoDB y de búsqueda vectorial de MongoDB con PyMongo. Los índices especifican el comportamiento de la búsqueda y los campos que se indexarán.

MongoDB Search permite realizar búsquedas de texto completo en colecciones alojadas en MongoDB Atlas. Los índices de MongoDB Search especifican el comportamiento de la búsqueda y los campos que se indexan.

La Búsqueda Vectorial de MongoDB permite realizar búsquedas semánticas en incrustaciones vectoriales almacenadas en MongoDB Atlas. Los índices de Búsqueda Vectorial definen los índices de las incrustaciones vectoriales que se desean consultar y los valores booleanos, de fecha, objectId, numéricos, de cadena o UUID que se utilizan para prefiltrar los datos.

Puede llamar a los siguientes métodos en una colección para administrar sus índices de búsqueda vectorial y de búsqueda de MongoDB:

  • create_search_index()

  • create_search_indexes()

  • list_search_indexes()

  • update_search_index()

  • drop_search_index()

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 list_search_indexes().

Las siguientes secciones proporcionan ejemplos de código que demuestran cómo utilizar cada uno de los métodos anteriores.

Puede utilizar los métodos create_search_index() y create_search_indexes() para crear índices de búsqueda MongoDB o índices de búsqueda vectorial MongoDB.

El siguiente ejemplo de código muestra cómo crear un único índice de búsqueda de MongoDB. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

index = {
"definition": {
"mappings": {
"dynamic": True
}
},
"name": "<index name>",
}
collection.create_search_index(index)
index = {
"definition": {
"mappings": {
"dynamic": True
}
},
"name": "<index name>",
}
await collection.create_search_index(index)

El siguiente ejemplo de código muestra cómo crear un único índice de búsqueda vectorial de MongoDB mediante el objeto SearchIndexModel. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

from pymongo.operations import SearchIndexModel
search_index_model = SearchIndexModel(
definition={
"fields": [
{
"type": "vector",
"numDimensions": <number of dimensions>,
"path": "<field to index>",
"similarity": "<select from euclidean, cosine, dotProduct>"
}
]
},
name="<index name>",
type="vectorSearch",
)
collection.create_search_index(model=search_index_model)
from pymongo.operations import SearchIndexModel
search_index_model = SearchIndexModel(
definition={
"fields": [
{
"type": "vector",
"numDimensions": <number of dimensions>,
"path": "<field to index>",
"similarity": "<select from euclidean, cosine, dotProduct>"
}
]
},
name="<index name>",
type="vectorSearch",
)
await collection.create_search_index(model=search_index_model)

Puede usar el método create_search_indexes() para crear varios índices. Estos índices pueden ser de MongoDB Search o de Vector Search. El create_search_indexes() método toma una lista de SearchIndexModel objetos que corresponden a cada índice que desea crear.

El siguiente ejemplo de código muestra cómo crear un índice de búsqueda de MongoDB y un índice de búsqueda vectorial de Atlas. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

search_idx = SearchIndexModel(
definition ={
"mappings": {
"dynamic": True
}
},
name="my_index",
)
vector_idx = SearchIndexModel(
definition={
"fields": [
{
"type": "vector",
"numDimensions": <number of dimensions>,
"path": "<field to index>",
"similarity": "<select from euclidean, cosine, dotProduct>"
}
]
},
name="my_vector_index",
type="vectorSearch",
)
indexes = [search_idx, vector_idx]
collection.create_search_indexes(models=indexes)
search_idx = SearchIndexModel(
definition ={
"mappings": {
"dynamic": True
}
},
name="my_index",
)
vector_idx = SearchIndexModel(
definition={
"fields": [
{
"type": "vector",
"numDimensions": <number of dimensions>,
"path": "<field to index>",
"similarity": "<select from euclidean, cosine, dotProduct>"
}
]
},
name="my_vector_index",
type="vectorSearch",
)
indexes = [search_idx, vector_idx]
await collection.create_search_indexes(models=indexes)

Puede utilizar el método list_search_indexes() para obtener información sobre los índices de búsqueda MongoDB y búsqueda vectorial de una colección.

El siguiente ejemplo de código muestra cómo imprimir una lista de los índices de búsqueda de una colección. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

results = list(collection.list_search_indexes())
for index in results:
print(index)
results = await (await collection.list_search_indexes()).to_list()
async for index in results:
print(index)

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

El siguiente ejemplo de código muestra cómo actualizar un índice de MongoDB Search. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:

new_index_definition = {
"mappings": {
"dynamic": False
}
}
collection.update_search_index("my_index", new_index)

El siguiente ejemplo de código muestra cómo actualizar un índice de búsqueda vectorial de MongoDB. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

new_index_definition = {
"fields": [
{
"type": "vector",
"numDimensions": 1536,
"path": "<field to index>",
"similarity": "euclidean"
},
]
}
collection.update_search_index("my_vector_index", new_index_definition)
new_index_definition = {
"fields": [
{
"type": "vector",
"numDimensions": 1536,
"path": "<field to index>",
"similarity": "euclidean"
},
]
}
await collection.update_search_index("my_vector_index", new_index_definition)

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

El siguiente código muestra cómo eliminar un índice de búsqueda de una colección. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

collection.drop_search_index("my_index")
await collection.drop_search_index("my_index")

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 y de búsqueda vectorial" de esta página.

El siguiente ejemplo crea un índice de texto en el campo plot. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

movies.create_index(
[( "plot", "text" )]
)
await movies.create_index(
[( "plot", "text" )]
)

El siguiente es un ejemplo de una consulta que utiliza el índice creado en el ejemplo de código anterior:

query = { "$text": { "$search": "a time-traveling DeLorean" } }
cursor = movies.find(query)

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

El siguiente ejemplo crea un índice de texto compuesto para los campos title y genre. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

from pymongo.collation import Collation
result = myColl.create_index(
[("title", "text"), ("genre", "text")],
default_language="english",
weights={ "title": 10, "genre": 3 },
collation=Collation(locale='fr_CA')
)
from pymongo.collation import Collation
result = await myColl.create_index(
[("title", "text"), ("genre", "text")],
default_language="english",
weights={ "title": 10, "genre": 3 },
collation=Collation(locale='fr_CA')
)

Para obtener más información, consulte Restricciones de índice de texto compuesto e Índices de texto en el manual de MongoDB Server.

MongoDB admite consultas de datos de coordenadas geoespaciales mediante 2índices dsphere. Con un 2dsphere índice, puede consultar los datos geoespaciales por inclusión, intersección y proximidad. Para obtener más información sobre cómo consultar datos geoespaciales, consulte Consultas geoespaciales.

Para crear un 2dsphere índice, debe especificar un campo que contenga únicamente objetos GeoJSON. Para más información sobre este tipo, consulte la guía de objetos GeoJSON en el manual de MongoDB Server.

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 crea un índice 2dsphere en el campo location.geo. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

theaters.create_index(
[( "location.geo", "2dsphere" )]
)
await theaters.create_index(
[( "location.geo", "2dsphere" )]
)

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 más información, consulte la guía de consultas geoespaciales en el manual de MongoDB Server.

Los índices únicos garantizan que los campos indexados no almacenen valores duplicados. De forma predeterminada, MongoDB crea un índice único en el campo _id durante la creación de una colección. Para crear un índice único, siga estos pasos:

  • Especifique el campo o la combinación de campos en los que desea evitar la duplicación.

  • Establezca la opción unique en "Verdadero".

El siguiente ejemplo crea un índice único descendente en el campo theaterId. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

theaters.create_index("theaterId", unique=True)
await theaters.create_index("theaterId", unique=True)

Para obtener más información, consulte la guía de índices únicos en el manual de MongoDB Server.

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 para todos los valores del campo location, incluidos los valores anidados en subdocumentos y matrices. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

movies.create_index({ "location.$**": pymongo.ASCENDING })
await movies.create_index({ "location.$**": pymongo.ASCENDING })

Para obtener más información, consulte la página Índices comodín en el manual de MongoDB Server.

Los índices agrupados indican a una colección que almacene documentos ordenados por un valor de clave. Para crear un índice agrupado, siga estos pasos al crear su colección:

  • Especifique la opción de índice agrupado con el campo _id como clave.

  • Establezca el campo único en True.

El siguiente ejemplo crea un índice agrupado en el campo _id de una nueva colección movie_reviews. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

sample_mflix.create_collection("movies", clusteredIndex={
"key": { "_id": 1 },
"unique": True
})
await sample_mflix.create_collection("movies", clusteredIndex={
"key": { "_id": 1 },
"unique": True
})

Para obtener más información, consulte las secciones Índice agrupado y Colecciones agrupadas en el manual de MongoDB Server.

Puede eliminar cualquier índice no utilizado excepto el índice único predeterminado en el campo _id.

Las siguientes secciones muestran cómo remover un único índice o cómo remover todos los índices de una colección.

Pase una instancia de un índice o el nombre del índice al método drop_index() para eliminar un índice de una colección.

El siguiente ejemplo elimina un índice llamado "_title_" de la colección movies. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

movies.drop_index("_title_")
await movies.drop_index("_title_")

Nota

No se puede eliminar un solo campo de un índice de texto compuesto. Debe eliminar todo el índice y crear uno nuevo para actualizar los campos indexados.

A partir de MongoDB 4.2, puede eliminar todos los índices llamando al método drop_indexes() de su colección. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

collection.drop_indexes()
await collection.drop_indexes()

Para versiones anteriores de MongoDB, pase "*" como parámetro a su llamada a drop_index() en su colección:

collection.drop_index("*")
await collection.drop_index("*")

Si realiza una operación de escritura que almacena un valor duplicado que viola un índice único, el controlador genera un DuplicateKeyException y MongoDB arroja un error similar al siguiente:

E11000 duplicate key error index

Para obtener más información sobre los índices en MongoDB, consulte la guía de índices en el manual del servidor MongoDB.

Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API:

Volver

Datos de Time Series