Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Ejecute un comando de base de datos

En esta guía, aprenderás a utilizar PyMongo para ejecutar un comando de base de datos. Puedes utilizar comandos de base de datos para realizar una variedad de tareas administrativas y de diagnóstico, como obtener estadísticas del servidor, inicializar un set de réplicas o ejecutar una pipeline de agregación.

Importante

Prefiera los métodos de la librería a los comandos de base de datos

La biblioteca proporciona métodos contenedor para muchos comandos de base de datos. Se recomienda usar estos métodos en lugar de ejecutar comandos de base de datos cuando sea posible.

Para realizar tareas administrativas, utilice la consola de MongoDB en lugar de PyMongo. La consola proporciona métodos auxiliares que podrían no estar disponibles en el controlador.

Si no hay asistentes disponibles en la librería o en el shell, puedes utilizar el método db.runCommand() del shell o el método command() del driver, que se describe en esta guía.

Puedes utilizar el método command() para ejecutar un comando de base de datos. Debes especificar el comando y cualquier argumento relevante. Si el comando es simple, se pueden pasar como cadenas de texto. De lo contrario, se pueden pasar como objeto dict. El método devolverá el resultado del comando que se ejecutó.

El siguiente código muestra cómo puedes usar el método command() en un Database para ejecutar el comando hello, que devuelve información sobre el servidor. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:

database = client.get_database("my_db")
hello = database.command("hello")
print(hello)

Para obtener una lista completa de los comandos de la base de datos y sus parámetros correspondientes, consulte la sección de Información adicional.

El método command() devuelve el resultado del comando ejecutado. También puede usar el método cursor_command(), que emite un comando de MongoDB y analiza la respuesta como un CommandCursor. El método CommandCursor permite iterar sobre los resultados de los comandos.

El siguiente ejemplo utiliza el método cursor_command() en la base de datos sample_mflix. Ejecuta el comando find en la colección movies para filtrar por documentos en los que el campo runtime tiene un valor de 11. Seleccione la pestaña Synchronous o Asynchronous para ver el código correspondiente:

database = client.get_database("sample_mflix")
result = database.cursor_command("find", "movies", filter={"runtime": 11})
print(result.to_list())

Para obtener información sobre el formato de respuesta del comando, consulte Comandos de base de datos.

Nota

preferencia de lectura

Los métodos command() y cursor_command() no respetan la preferencia de lectura que hayas configurado en tu instancia Database en otra parte de tu código. Si se proporciona una ClientSession mediante el parámetro session y esta sesión está dentro de una transacción, la preferencia de lectura del comando se establecerá según la preferencia de lectura de la transacción. De lo contrario, la preferencia de lectura del comando será PRIMARY por defecto.

Puedes establecer una preferencia de lectura para la ejecución de comandos utilizando el parámetro read_preference. Por ejemplo:

from pymongo.read_preferences import Secondary
database = client.get_database("my_db")
hello = database.command("hello", read_preference=Secondary())
print(hello)

Obtenga más información sobre el módulo read_preferences en la documentación de la API.

Para obtener más información sobre las opciones de preferencia de lectura, consulte la sección Preferencia de lectura en el manual del servidor MongoDB.

El siguiente ejemplo usa el método command() para ejecutar el comando dbStats para recuperar estadísticas de almacenamiento para la base de datos sample_mflix. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:

database = client.get_database("sample_mflix")
result = database.command("dbStats")
print(result)

El resultado de este comando incluye información sobre las colecciones en la base de datos y describe la cantidad y tamaño de los datos almacenados en las colecciones.

El método Database.command() puede decodificar los documentos BSON devueltos en instancias de una clase específica. Para especificar esta clase, construya un objeto CodecOptions y pase el nombre de la clase. La clase puede ser de uno de los siguientes tipos:

  • bson.raw_bson.RawBSONDocument. Para aprender más sobre la clase RawBSONDocument, consulta Trabajar con datos BSON sin procesar.

  • Una subclase del tipo collections.abc.Mapping, como OrderedDict. Dependiendo de la rigurosidad de las reglas de control de tipos, es posible que también debas especificar tipos para la clave y el valor.

  • Una subclase del tipo TypedDict. Para pasar una subclase TypedDict para este parámetro, también debe incluir la clase en una sugerencia de tipo para su objeto CodecOptions.

Nota

TypedDict en Python 3.7 y versiones anteriores

La clase TypedDict se encuentra en el módulo typing, disponible únicamente en Python 3.8 y versiones posteriores. Para usar la clase TypedDict en versiones anteriores de Python, instale el paquete typing_extensions.

El siguiente ejemplo decodifica el BSON devuelto por el comando ping en instancias de la clase RawBSONDocument. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:

from pymongo import MongoClient
from bson.raw_bson import RawBSONDocument
from bson import CodecOptions
client: MongoClient = MongoClient()
options = CodecOptions(RawBSONDocument)
result = client.admin.command("ping", codec_options=options)

Para decodificar BSON en una subclase de la clase TypedDict, especifica el nombre de la clase en la sugerencia de tipo CodecOptions, como se muestra en el siguiente ejemplo. Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:

from pymongo import MongoClient
from bson.raw_bson import RawBSONDocument
from bson import CodecOptions
from typing import TypedDict
class Movie(TypedDict):
name: str
year: int
client: MongoClient = MongoClient()
options: CodecOptions[Movie] = CodecOptions(Movie)
result = client.admin.command("ping", codec_options=options)

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]].

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

Para obtener más información sobre los conceptos de esta guía, consulta la siguiente documentación en el manual de MongoDB Server:

Para obtener más información sobre los métodos command() y cursor_command(), consulte la siguiente documentación de la API de PyMongo: