Bancos de dados e coleções
Visão geral
Neste guia, você pode aprender como usar bancos de dados e coleções MongoDB com PyMongo.
O MongoDB organiza os dados em uma hierarquia dos seguintes níveis:
Bancos de dados: o nível mais alto de organização de dados em uma instância do MongoDB.
Collections: o MongoDB armazena documentos em collections. Elas são análogas às tabelas do banco de dados relacional.
Documentos: contêm dados literais, como string, números, datas e outros documentos incorporados.
Para obter mais informações sobre os tipos e estrutura de campos de documentos, consulte o guia Documentos no manual do MongoDB Server .
Acessar um banco de dados
Acesse um banco de dados utilizando acesso de estilo de dicionário na sua instância do MongoClient
.
O exemplo a seguir acessa um banco de dados denominado test_database
:
database = client["test_database"]
Acessar uma coleção
Acesse uma coleção usando o acesso no estilo de dicionário em uma instância do seu banco de dados.
O exemplo a seguir acessa uma coleção denominada test_collection
:
database = client["test_database"] collection = database["test_collection"]
Dica
Se o nome da coleção fornecido ainda não existir no banco de dados, o MongoDB criará implicitamente a coleção quando você inserir os dados pela primeira vez nela.
Criar uma coleção
Use o método create_collection()
para criar explicitamente uma coleção em um banco de MongoDB database.
O exemplo a seguir cria uma coleção chamada example_collection
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
database = client["test_database"] database.create_collection("example_collection")
database = client["test_database"] await database.create_collection("example_collection")
Você pode especificar opções de collection, como tamanho máximo e regras de validação de documento , passando-as como argumentos de palavra-chave. Para obter uma lista completa de parâmetros opcionais, consulte a documentação da API create_collection().
Coleção de séries temporais
As coleções de séries temporais armazenam eficientemente sequências de medições durante um período de tempo. O exemplo a seguir cria uma coleção de séries temporais chamada example_ts_collection
na qual o campo de tempo dos documentos é chamado timestamp
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
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 obter mais informações sobre o uso de dados de série temporal com o PyMongo, consulte o guia Dados de série temporal .
Coleção limitada
Você pode criar uma collection limitada que não pode ultrapassar um tamanho de memória ou contagem de documento especificado. O exemplo a seguir cria uma collection limitada chamada example_capped_collection
que tem um tamanho máximo de 1000 bytes. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
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 saber mais sobre coleções limitadas, consulte Coleções limitadas no manual do MongoDB Server .
Obter uma lista de coleções
Você pode executar query de uma lista de coleções em um banco de dados ligando para o método list_collections()
. O método retorna um cursor contendo todas as collections no banco de dados e seus metadados associados.
O exemplo seguinte chama o método list_collections()
e itera sobre o cursor para imprimir os resultados. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
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 executar query somente dos nomes das collections no banco de dados, chame o método list_collection_name()
da seguinte forma:
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 obter mais informações sobre a iteração em um cursor, consulte Acessar dados de um cursor.
Excluir uma coleção
Você pode excluir uma coleção do banco de dados utilizando o método drop_collection()
.
O exemplo a seguir exclui a collection test_collection
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
collection = database["test_collection"] collection.drop()
collection = database["test_collection"] await collection.drop()
Aviso
Eliminar uma coleção exclui todos os dados da coleção
Descartar uma collection do seu banco de dados exclui permanentemente todos os documentos e todos os índices dessa collection.
Solte uma coleção somente se os dados nela não forem mais necessários.
Dicas de tipo
Se seu aplicação usar o Python 3.5 ou posterior, você poderá adicionar dicas de tipo, conforme descrito em PEP 484, ao seu código. As dicas de tipo denotam os tipos de dados de variáveis, parâmetros e valores de retorno de função, e a estrutura de documentos. Alguns IDEs podem usar dicas de tipo para verificar erros de tipo seu código e sugerir opções apropriadas para a conclusão do código.
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.
Database
Se todos os documentos em um banco de dados corresponderem a um esquema bem definido, você poderá especificar uma dica de tipo que usa uma classe Python para representar a estrutura dos documentos. Ao incluir essa classe na dica de tipo do seu objeto Database
, você pode garantir que todos os documentos armazenados ou recuperados tenham a estrutura necessária. Isso fornece uma verificação de tipo e conclusão de código mais precisas do que o tipo Dict[str, Any]
padrão.
Primeiro, defina uma classe para representar um documento do banco de dados. A classe deve herdar da classe TypedDict
e deve conter os mesmos campos que os documentos no banco de dados. Depois de definir sua classe, inclua seu nome como tipo genérico para a dica de tipo Database
.
O exemplo a seguir define uma classe Movie
e a utiliza como tipo genérico para uma dica de tipo Database
. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
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"]
collection
Adicionar um tipo genérico a uma dica de tipo do Collection
é semelhante a adicionar um tipo genérico a uma dica de tipo do Database
. Primeiro, defina uma classe que herda da classe TypedDict
e representa a estrutura dos documentos na collection. Em seguida, inclua o nome da classe como o tipo genérico para a dica de tipo Collection
, conforme mostrado no exemplo a seguir. Selecione a aba Synchronous ou Asynchronous para ver o código correspondente:
from typing import TypedDict from pymongo import MongoClient from pymongo.asynchronous.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.collection import Collection class Movie(TypedDict): name: str year: int client: AsyncMongoClient = AsyncMongoClient() database = client["test_database"] collection: Collection[Movie] = database["test_collection"]
Solução de problemas
Anotações do tipo de cliente
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]]
.
Tipo incompatível
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]]``
AutoReconnect
Erro
Você recebe este erro se especificar tag-sets
em sua preferência de leitura e o MongoDB não conseguir encontrar membros do conjunto de réplicas com as tags especificadas. Para evitar esse erro, inclua um dicionário vazio ({}
) no final da lista de conjuntos de tags. Isso instrui o PyMongo a ler de qualquer membro que corresponda ao modo de referência de leitura quando não conseguir encontrar tags correspondentes.
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: