Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Driver Pymongo

Executar um comando de banco de dados

Neste guia, você pode aprender como usar o PyMongo para executar um comando de banco de dados de dados. Você pode usar comandos de banco de dados de dados para executar uma variedade de tarefas administrativas e de diagnóstico, como buscar estatísticas do servidor , inicializar um conjunto de réplicas ou executar um pipeline de agregação .

Importante

Preferir métodos de biblioteca a comandos de banco de dados

A biblioteca fornece métodos wrapper para muitos comandos de banco de dados de dados. Recomendamos usar esses métodos em vez de executar comandos do banco de dados de dados quando possível.

Para executar tarefas administrativas, use o shell do shell MongoDB em vez do PyMongo PyMongo. O shell fornece métodos assistente que podem não estar disponíveis no driver.

Se não houver auxiliares disponíveis na biblioteca ou no shell, você poderá usar o método shell db.runCommand() ou o método command() do driver, descrito neste guia.

Você pode utilizar o método command() para executar um comando de banco de dados de dados. Você deve especificar o comando e quaisquer argumentos relevantes. Se o comando for simples, eles podem ser passados como strings. Caso contrário, eles podem ser passados como um objeto dict. O método retornará o resultado do comando que foi executado.

O seguinte código mostra como você pode utilizar o método command() em um Database para executar o comando hello, que retorna informações sobre o servidor:

database = client.get_database("my_db")
hello = database.command("hello")
print(hello)
{
'topologyVersion': {
'processId': ObjectId('6724d211d6b98fa1931e8616'),
'counter': 6
},
'hosts': ['cluster0-shard-00-00.fxoii.mongodb.net:27017',
'cluster0-shard-00-01.fxoii.mongodb.net:27017',
'cluster0-shard-00-02.fxoii.mongodb.net:27017'],
'setName': 'atlas-13l6uw-shard-0',
'setVersion': 114,
'isWritablePrimary': True,
'secondary': False,
'primary': 'cluster0-shard-00-02.fxoii.mongodb.net:27017',
'tags': {
'workloadType': 'OPERATIONAL',
'diskState': 'READY',
'region': 'US_EAST_1',
'provider': 'AWS',
'nodeType': 'ELECTABLE',
'availabilityZone': 'use1-az5'
},
'me': 'cluster0-shard-00-02.fxoii.mongodb.net:27017',
'electionId': ObjectId('7fffffff00000000000000e3'),
'lastWrite': {
'opTime': {
'ts': Timestamp(1730486145, 22),
't': 227
},
'lastWriteDate': datetime.datetime(2024, 11, 1, 18, 35, 45),
'majorityOpTime': {
'ts': Timestamp(1730486145, 22),
't': 227
},
'majorityWriteDate': datetime.datetime(2024, 11, 1, 18, 35, 45)
},
'maxBsonObjectSize': 16777216,
'maxMessageSizeBytes': 48000000,
'maxWriteBatchSize': 100000,
'localTime': datetime.datetime(2024, 11, 1, 18, 35, 45, 309000),
'logicalSessionTimeoutMinutes': 30,
'connectionId': 23889,
'minWireVersion': 0,
'maxWireVersion': 21,
'readOnly': False,
'ok': 1.0,
'$clusterTime': {
'clusterTime': Timestamp(1730486145, 22),
'signature': {
'hash': b"\x1a\xf7{>q%F\xc2\x89\x15\x13W29\x91\xaae'~\xe4",
'keyId': 7379292132843978793
}
},
'operationTime': Timestamp(1730486145, 22)
}

Para obter uma lista completa dos comandos do banco de dados e dos parâmetros correspondentes, consulte a seção Informações adicionais.

O método command() retorna o resultado do comando que foi executado. Você também pode usar o cursor_command() método, que emite um comando MongoDB e analisa a resposta como um CommandCursor. O CommandCursor pode ser utilizado para iterar sobre os resultados do comando.

O exemplo seguinte utiliza o método cursor_command() no banco de banco de dados sample_mflix. Ele executa o comando find na collection movies para filtrar por documentos nos quais o campo runtime tem valor de 11.

database = client.get_database("sample_mflix")
result = database.cursor_command("find", "movies", filter={"runtime": 11})
print(result.to_list())
{
'_id': ObjectId('573a1390f29313caabcd42e8'),
'runtime': 11,
'title': 'The Great Train Robbery',
...
},
{
{'_id': ObjectId('573a1394f29313caabce0f10'),
'runtime': 11,
'title': 'Glas',
...
},
...

Para saber mais sobre o formato de resposta do comando, consulte Comandos do banco de dados.

Observação

readPreference

Os métodos command() e cursor_command() não obedecem à preferência de leitura que você pode ter definido em sua instância Database em outras partes do seu código. Se uma ClientSession for fornecida usando o session parâmetro e essa sessão estiver em uma transação, a preferência de leitura do comando será definida como a preferência de leitura da transação. Caso contrário, a preferência de leitura do comando será padronizada como PRIMARY.

Você pode definir uma preferência de leitura para a execução do comando usando o parâmetro read_preference, conforme mostrado no código a seguir:

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

Saiba mais sobre o read_preferences módulo na documentação da API.

Para saber mais sobre as opções de preferência de leitura , consulte Read preference no manual do MongoDB Server .

O exemplo seguinte utiliza o método command() para executar o comando dbStats para recuperar estatísticas de armazenamento para o banco de banco de dados do sample_mflix :

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}

A saída desse comando inclui informações sobre as collections no banco de dados de dados e descreve a quantidade e o tamanho dos dados armazenados nas collections.

O método Database.command() pode decodificar os documentos BSON retornados para instâncias de uma classe específica. Para especificar essa classe, construa um objeto CodecOptions e passe o nome da classe . A classe pode ser um dos seguintes tipos:

  • bson.raw_bson.RawBSONDocument. Para saber mais sobre a classe RawBSONDocument, consulte Trabalhar com dados brutos BSON.

  • Uma subclasse do tipo collections.abc.Mapping, como OrderedDict. Dependendo do detalhamento de suas regras de verificação de tipo, talvez você também precise especificar tipos para a chave e o valor.

  • Uma subclasse do tipo TypedDict. Para passar uma subclasse TypedDict para esse parâmetro, você também deve incluir a classe em uma dica de tipo para seu objeto CodecOptions.

Observação

TypedDict no Python 3.7 e anteriores

A classe TypedDict está no módulo typing, que está disponível somente no Python 3.8 e posterior. Para usar a TypedDict classe em versões anteriores do Python, instale o pacote digitando_extensões.

O exemplo seguinte decodifica o BSON retornado pelo comando ping para instâncias da classe RawBSONDocument :

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 para uma subclasse da classe TypedDict, especifique o nome da classe na dica de tipo CodecOptions, como mostrado no seguinte exemplo:

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)

Se você não adicionar uma anotação de tipo para seu objeto MongoClient, seu verificador de tipo poderá mostrar um erro semelhante ao seguinte:

from pymongo import MongoClient
client = MongoClient() # error: Need type annotation for "client"

A solução é anotar o objeto MongoClient como client: MongoClient ou client: MongoClient[Dict[str, Any]].

Se você especificar MongoClient como uma dica de tipo, mas não incluir tipos de dados para o documento, as chaves e os valores, seu verificador de tipo poderá mostrar um erro semelhante ao seguinte:

error: Dict entry 0 has incompatible type "str": "int";
expected "Mapping[str, Any]": "int"

A solução é adicionar a seguinte dica de tipo ao seu objeto MongoClient :

``client: MongoClient[Dict[str, Any]]``

Para obter mais informações sobre os conceitos deste guia, consulte a seguinte documentação no manual do MongoDB Server :

Para obter mais informações sobre os métodos command() e cursor_command(), consulte a seguinte documentação da API do PyMongo:

Voltar

Indexes

Nesta página