Overview
En esta guía, puedes aprender a usar bases de datos y colecciones de MongoDB con PyMongo.
MongoDB organiza los datos en una jerarquía de los siguientes niveles:
Bases de datos: El nivel más alto de organización de datos en una instancia de MongoDB.
Colecciones: MongoDB almacena documentos en colecciones. Son análogos a las tablas en bases de datos relacionales.
Documentos: Contienen datos literales como strings, números, fechas y otros documentos incrustados.
Para obtener más información sobre los tipos y la estructura de los campos de documentos, consulte la Guía dedocumentos en el manual de MongoDB Server.
Acceder a una base de datos
Acceda a una base de datos mediante el acceso estilo diccionario en su MongoClient instancia.
El siguiente ejemplo accede a una base de datos llamada test_database:
database = client["test_database"]
Acceder a una colección
Se debe acceder a una colección usando acceso tipo diccionario en una instancia de la base de datos.
El siguiente ejemplo accede a una colección llamada test_collection:
database = client["test_database"] collection = database["test_collection"]
Tip
Si el nombre de la colección proporcionado aún no existe en la base de datos, MongoDB crea implícitamente la colección cuando se insertan datos en ella por primera vez.
Crear una colección
Utilice el método create_collection() para crear explícitamente una colección en una base de datos de MongoDB.
El siguiente ejemplo crea una colección llamada example_collection. Seleccione el
Synchronous o pestaña Asynchronous para ver el código correspondiente:
database = client["test_database"] database.create_collection("example_collection")
database = client["test_database"] await database.create_collection("example_collection")
Puedes especificar opciones de colección, como el tamaño máximo y las reglas de validación de documentos, pasándolas como argumentos de palabras clave. Para obtener una lista completa de parámetros opcionales, consulta la documentación de API create_collection().
Colección de series de tiempo
Las colecciones de series de tiempo almacenan eficientemente secuencias de mediciones a lo largo de un período de tiempo. El siguiente ejemplo crea una colección de series de tiempo llamada example_ts_collection en la que el campo de tiempo de los documentos se denomina timestamp. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
database = client["test_database"] database.create_collection("example_ts_collection", timeseries={"timeField": "timestamp"})
database = client["test_database"] await database.create_collection("example_ts_collection", timeseries={"timeField": "timestamp"})
Para obtener más información sobre el uso de datos de series de tiempo con PyMongo, consulte la Guíade datos de series de tiempo.
Colección con tamaño fijo
Puedes crear una colección con tamaño fijo que no pueda crecer más allá de un tamaño de memoria o un número de documentos especificados. El siguiente ejemplo crea una colección con tamaño fijo llamada example_capped_collection que tiene un tamaño máximo de 1000 bytes. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
database = client["test_database"] database.create_collection("example_capped_collection", capped=True, size=1000)
database = client["test_database"] await database.create_collection("example_capped_collection", capped=True, size=1000)
Para obtener más información sobre las colecciones con tamaño fijo, consulta Colecciones con tamaño fijo en el manual de MongoDB Server.
Obtén una lista de colecciones
Puedes hacer un query para una lista de colecciones en una base de datos mediante el método list_collections(). El método devuelve un cursor que contiene todas las colecciones en la base de datos y sus metadatos asociados.
El siguiente ejemplo lleva a cabo el método list_collections() y recorre el cursor para imprimir los resultados. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
database = client["test_database"] collection_list = database.list_collections() for c in collection_list: print(c)
database = client["test_database"] collection_list = await database.list_collections() for c in collection_list: print(c)
Para hacer un query para solo los nombres de las colecciones en la base de datos, lleva a cabo el método list_collection_name() de la siguiente manera:
collection_list = database.list_collection_names() for c in collection_list: print(c)
collection_list = await database.list_collection_names() async for c in collection_list: print(c)
Para obtener más información sobre cómo iterar sobre un cursor, consulta Acceder a los datos desde un cursor.
Borrar una colección
Puedes borrar una colección de la base de datos utilizando el método drop_collection().
El siguiente ejemplo elimina la colección test_collection. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
collection = database["test_collection"] collection.drop()
collection = database["test_collection"] await collection.drop()
Advertencia
Eliminar una colección borra todos los datos de la colección
Borrar una colección de la base de datos borra permanentemente todos los documentos y todos los índices dentro de esa colección.
Descartar una colección solo si los datos que contiene ya no son necesarios.
Borrar una base de datos
Se puede eliminar una base de datos del clúster llamando al método drop_database() en una instancia MongoClient.
El siguiente ejemplo borra la base de datos "test_database". Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
client.drop_database("test_database")
await client.drop_database("test_database")
Advertencia
Borrar una base de datos borra todos los datos de la base de datos.
Borrar una base de datos borra permanentemente todas las colecciones, documentos e índices dentro de esa base de datos.
Descarta una base de datos solo si los datos que contiene ya no son necesarios.
Sugerencias de tipo
Si la aplicación usa Python 3.5 o posterior, se pueden agregar anotaciones de tipo, como se describe en PEP 484, al código. Las anotaciones de tipo indican los tipos de datos de las variables, los parámetros y los valores de retorno de las funciones, así como la estructura de los documentos. Algunos IDE pueden usar sugerencias de tipo para verificar el código en busca de errores de tipo y sugerir opciones adecuadas para la finalización del código.
Nota
TypedDict en Python 3.7 y versiones anteriores
La clase TypedDict se encuentra en el módulo typing, el cual está disponible solo en Python 3.8 y versiones posteriores. Para usar la clase TypedDict en versiones anteriores de Python, instala el paquete typing_extensions.
Database
Si todos los documentos en una base de datos coinciden con un esquema bien definido, se puede especificar una sugerencia de tipo que use una clase de Python para representar la estructura de los documentos. Al incluir esta clase en la sugerencia de tipo para el objeto Database, se puede garantizar que todos los documentos que se almacenen o recuperen tengan la estructura requerida. Esto proporciona una comprobación de tipos y una finalización de código más precisas que el tipo Dict[str, Any] por defecto.
Primero, se debe definir una clase para representar un documento de la base de datos. La clase debe heredar de la clase TypedDict y debe contener los mismos campos que los documentos en la base de datos. Después de definir la clase, se debe incluir el nombre como el tipo genérico para la sugerencia de tipo Database.
El siguiente ejemplo define una clase Movie y la utiliza como tipo genérico para una pista de tipo Database. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
from typing import TypedDict from pymongo import MongoClient from pymongo.database import Database class Movie(TypedDict): name: str year: int client: MongoClient = MongoClient() database: Database[Movie] = client["test_database"]
from typing import TypedDict from pymongo import AsyncMongoClient from pymongo.asynchronous.database import Database class Movie(TypedDict): name: str year: int client: AsyncMongoClient = AsyncMongoClient() database: Database[Movie] = client["test_database"]
Colección
Agregar un tipo genérico a una indicación de tipo Collection es similar a agregar un tipo genérico a una indicación de tipo Database. Primero, define una clase que herede de la clase TypedDict y represente la estructura de los documentos en la colección. Luego, incluye el nombre de la clase como tipo genérico para la sugerencia de tipo Collection, como se muestra en el siguiente ejemplo. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
from typing import TypedDict from pymongo import MongoClient from pymongo.collection import Collection class Movie(TypedDict): name: str year: int client: MongoClient = MongoClient() database = client["test_database"] collection: Collection[Movie] = database["test_collection"]
from typing import TypedDict from pymongo import AsyncMongoClient from pymongo.asynchronous.collection import Collection class Movie(TypedDict): name: str year: int client: AsyncMongoClient = AsyncMongoClient() database = client["test_database"] collection: Collection[Movie] = database["test_collection"]
Solución de problemas
Anotaciones de tipo de cliente
Si no se agrega una anotación de tipo para el objeto MongoClient, el verificador de tipos podría mostrar un error similar al siguiente:
from pymongo import MongoClient client = MongoClient() # error: Need type annotation for "client"
La solución es anotar el objeto MongoClient como client: MongoClient o client: MongoClient[Dict[str, Any]].
Tipo incompatible
Si especifica MongoClient como una sugerencia de tipo, pero no incluye los tipos de datos para el documento, las claves y los valores, su verificador de tipos podría mostrar un error similar al siguiente:
error: Dict entry 0 has incompatible type "str": "int"; expected "Mapping[str, Any]": "int"
La solución es agregar la siguiente sugerencia de tipo al objeto MongoClient:
client: MongoClient[Dict[str, Any]]
AutoReconnect Error
Se recibe este error si se especifica tag-sets en la preferencia de lectura y MongoDB no puede encontrar nodos del set de réplicas con las etiquetas especificadas. Para evitar este error, se debe incluir un diccionario vacío ({}) al final de la lista de conjuntos de etiquetas. Esto indica a PyMongo que debe leer de cualquier nodo que coincida con el modo de referencia de lectura cuando no pueda encontrar etiquetas coincidentes.
Documentación de la API
Para aprender más sobre cualquiera de los métodos o tipos analizados en esta guía, consulta la siguiente documentación de API: