Docs Menu
Docs Home
/ /

Ejecute un comando de base de datos

En esta guía, aprenderá a usar PyMongo para ejecutar un comando de base de datos. Puede usar comandos de base de datos para realizar diversas tareas administrativas y de diagnóstico, como obtener estadísticas del servidor, inicializar un conjunto de réplicas o ejecutar una canalización de agregación.

Importante

Prefiera los métodos de biblioteca a los comandos de base de datos

La biblioteca proporciona métodos de encapsulamiento para numerosos comandos de base de datos. Recomendamos usar estos métodos en lugar de ejecutar comandos de base de datos siempre que sea posible.

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

Si no hay ayudantes disponibles en la biblioteca o el shell, puede utilizar el db.runCommand() método de shell o el método command() del controlador, que se describe en esta guía.

Puede usar el método command() para ejecutar un comando de base de datos. Debe especificar el comando y los argumentos relevantes. Si el comando es simple, estos pueden pasarse como cadenas. De lo contrario, pueden pasarse como un objeto dict. El método devolverá el resultado del comando ejecutado.

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

database = client.get_database("my_db")
hello = database.command("hello")
print(hello)
{
'topologyVersion': {
'processId': ObjectId('...'),
'counter': 6
},
'hosts': [...],
'setName': '...',
'setVersion': 114,
'isWritablePrimary': True,
'secondary': False,
'primary': '...',
'tags': {...},
'me': '...',
'electionId': ...,
'lastWrite': {...},
'maxBsonObjectSize': 16777216,
'maxMessageSizeBytes': 48000000,
'maxWriteBatchSize': 100000,
'localTime': ...,
'logicalSessionTimeoutMinutes': 30,
'connectionId': ...,
'minWireVersion': 0,
'maxWireVersion': 21,
'readOnly': False,
'ok': 1.0,
'$clusterTime': {...},
'operationTime': ...
}
database = client.get_database("my_db")
hello = await database.command("hello")
print(hello)
{
'topologyVersion': {
'processId': ObjectId('...'),
'counter': 6
},
'hosts': [...],
'setName': '...',
'setVersion': 114,
'isWritablePrimary': True,
'secondary': False,
'primary': '...',
'tags': {...},
'me': '...',
'electionId': ...,
'lastWrite': {...},
'maxBsonObjectSize': 16777216,
'maxMessageSizeBytes': 48000000,
'maxWriteBatchSize': 100000,
'localTime': ...,
'logicalSessionTimeoutMinutes': 30,
'connectionId': ...,
'minWireVersion': 0,
'maxWireVersion': 21,
'readOnly': False,
'ok': 1.0,
'$clusterTime': {...},
'operationTime': ...
}

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

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

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 cuyo campo runtime tenga el valor 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())
{
'_id': ObjectId(...),
'runtime': 11,
'title': 'The Great Train Robbery',
...
},
{
{'_id': ObjectId(...),
'runtime': 11,
'title': 'Glas',
...
},
...
database = client.get_database("sample_mflix")
result = await database.cursor_command("find", "movies", filter={"runtime": 11})
print(result.to_list())
{
'_id': ObjectId(...),
'runtime': 11,
'title': 'The Great Train Robbery',
...
},
{
{'_id': ObjectId(...),
'runtime': 11,
'title': 'Glas',
...
},
...

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

Nota

preferencia de lectura

Los command() cursor_command() métodos y no siguen la preferencia de lectura que podría haber establecido Database en su instancia en otra parte del código. Si se proporciona una ClientSession mediante el session parámetro, y esta sesión está en una transacción, la preferencia de lectura del comando se establecerá en la preferencia de lectura de la transacción. De lo contrario, la preferencia de lectura del comando se establece en PRIMARY por defecto.

Puede establecer una preferencia de lectura para la ejecución de comandos mediante 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)

Aprenda más sobre el módulo read_preferences en la documentación API.

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

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

database = client.get_database("sample_mflix")
result = database.command("dbStats")
print(result)
{'db': 'sample_mflix', 'collections': 9, 'views': 1, 'objects': 67662,
'avgObjSize': 1796.788182436227, 'dataSize': 121574282, 'storageSize': 97779712,
'totalFreeStorageSize': 0, 'numExtents': 0, 'indexes': 13, 'indexSize': 19423232,
'indexFreeStorageSize': 0, 'fileSize': 0, 'nsSizeMB': 0, 'ok': 1}
database = client.get_database("sample_mflix")
result = await database.command("dbStats")
print(result)
{'db': 'sample_mflix', 'collections': 9, 'views': 1, 'objects': 67662,
'avgObjSize': 1796.788182436227, 'dataSize': 121574282, 'storageSize': 97779712,
'totalFreeStorageSize': 0, 'numExtents': 0, 'indexes': 13, 'indexSize': 19423232,
'indexFreeStorageSize': 0, 'fileSize': 0, 'nsSizeMB': 0, 'ok': 1}

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

El método Database.command() puede decodificar los documentos BSON devueltos a 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.RawBSONDocumentPara obtener más información sobre la clase RawBSONDocument, consulte Trabajar con datos BSON sin procesar.

  • Una subclase del tipo collections.abc.Mapping, como OrderedDict. Dependiendo de la rigurosidad de sus reglas de verificación de tipos, es posible que también deba especificar los tipos de 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, 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.

El siguiente ejemplo decodifica el BSON devuelto por el comando ping en instancias de la clase RawBSONDocument. Seleccione 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)
from pymongo import AsyncMongoClient
from bson.raw_bson import RawBSONDocument
from bson import CodecOptions
client: AsyncMongoClient = AsyncMongoClient()
options = CodecOptions(RawBSONDocument)
result = await client.admin.command("ping", codec_options=options)

Para decodificar BSON a una subclase de la clase TypedDict, especifique el nombre de la clase en la indicación de tipo CodecOptions, como se muestra en el siguiente ejemplo. Seleccione 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)
from pymongo import AsyncMongoClient
from bson.raw_bson import RawBSONDocument
from bson import CodecOptions
from typing import TypedDict
class Movie(TypedDict):
name: str
year: int
client: AsyncMongoClient = AsyncMongoClient()
options: CodecOptions[Movie] = CodecOptions(Movie)
result = await 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, consulte 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:

Volver

Indexes

En esta página