O MongoDB é uma solução de banco de dados NoSQL orientada a documentos que oferece grande escalabilidade e flexibilidade, juntamente com um poderoso sistema de consulta. Com MongoDB e Python, você pode desenvolver muitos tipos diferentes de aplicativos de banco de dados rapidamente. Portanto, se seu aplicativo Python precisar de um banco de dados tão flexível quanto a própria linguagem, o MongoDB é para você.
Neste tutorial, você aprenderá:
- O que MongoDB é
- Como instalar e executar MongoDB
- Como trabalhar com bancos de dados MongoDB
- Como usar o driver PyMongo de baixo nível fazer interface com o MongoDB
- Como usar o mapeador de documento de objeto (ODM) MongoEngine de alto nível
Ao longo deste tutorial, você escreverá alguns exemplos que demonstrarão a flexibilidade e o poder do MongoDB e seu excelente suporte ao Python. Para baixar o código-fonte desses exemplos, clique no link abaixo:
Obter o código-fonte: Clique aqui para obter o código-fonte que você usará para aprender a usar o MongoDB com Python neste tutorial.
Usando bancos de dados SQL vs NoSQL
Por décadas, os bancos de dados SQL foram uma das únicas opções para desenvolvedores que buscavam construir sistemas de banco de dados grandes e escaláveis. No entanto, a crescente necessidade de armazenar estruturas de dados complexas levou ao nascimento do NoSQL bancos de dados. Esse novo tipo de sistema de banco de dados permite que os desenvolvedores armazenem dados heterogêneos e sem estrutura de forma eficiente.
Em geral, os sistemas de banco de dados NoSQL armazenam e recuperam dados de uma maneira muito diferente dos sistemas de gerenciamento de banco de dados relacional SQL (RDBMSs).
Quando se trata de escolher entre as tecnologias de banco de dados atualmente disponíveis, talvez seja necessário decidir entre usar sistemas SQL ou NoSQL. Ambos têm características específicas que você deve considerar ao escolher um ou outro. Aqui estão algumas de suas diferenças mais substanciais:
Propriedade | Bancos de dados SQL | Bancos de dados NoSQL |
---|---|---|
Modelo de dados | Relacional | Não relacional |
Estrutura | Baseado em tabela, com colunas e linhas | Com base em documentos, pares de valores-chave, gráfico ou coluna larga |
Esquema | Um esquema predefinido e estrito no qual cada registro (linha) é da mesma natureza e possui as mesmas propriedades | Um esquema dinâmico ou sem esquema, o que significa que os registros não precisam ser da mesma natureza |
Linguagem de consulta | Linguagem de consulta estruturada (SQL) | Varia de banco de dados para banco de dados |
Escalabilidade | Vertical | Horizontal |
Transações ACID | Suportado | Suportado, dependendo do banco de dados NoSQL específico |
Capacidade de adicionar novas propriedades | Precisa alterar o esquema primeiro | Possível sem atrapalhar nada |
Existem muitas outras diferenças entre os dois tipos de banco de dados, mas as mencionadas acima são algumas das mais importantes a serem conhecidas.
Ao escolher um banco de dados, você deve considerar cuidadosamente seus pontos fortes e fracos. Você também precisa considerar como o banco de dados se encaixa no seu cenário específico e nos requisitos do seu aplicativo. Às vezes, a solução certa é usar uma combinação de bancos de dados SQL e NoSQL para lidar com diferentes aspectos de um sistema mais amplo.
Alguns exemplos comuns de bancos de dados SQL incluem:
- SQLite
- MySQL
- Oráculo
- PostgreSQL
- Microsoft SQL Server
Exemplos de banco de dados NoSQL incluem:
- DynamoDB
- Cassandra
- Redis
- CouchDB
- RethinkDB
- RavenDB
- MongoDB
Nos últimos anos, os bancos de dados SQL e NoSQL começaram a se fundir. Por exemplo, sistemas de banco de dados, como PostgreSQL, MySQL e Microsoft SQL Server agora suportam o armazenamento e consulta de dados JSON, assim como os bancos de dados NoSQL. Com isso, agora você pode obter muitos dos mesmos resultados com ambas as tecnologias. Mas você ainda não obtém muitos dos recursos NoSQL, como dimensionamento horizontal e interface amigável.
Com este breve histórico sobre bancos de dados SQL e NoSQL, você pode se concentrar no tópico principal deste tutorial:o banco de dados MongoDB e como usá-lo em Python.
Gerenciando bancos de dados NoSQL com MongoDB
MongoDB é um orientado a documentos banco de dados classificado como NoSQL. Tornou-se popular em todo o setor nos últimos anos e se integra extremamente bem ao Python. Ao contrário dos RDBMSs SQL tradicionais, o MongoDB usa coleções de documentos em vez de tabelas de linhas para organizar e armazenar dados.
O MongoDB armazena dados em documentos semelhantes a JSON sem esquema e flexíveis. Aqui, sem esquema significa que você pode ter documentos com um conjunto diferente de campos na mesma coleção, sem a necessidade de satisfazer uma tabela rígida esquema .
Você pode alterar a estrutura de seus documentos e dados ao longo do tempo, o que resulta em um sistema flexível que permite que você se adapte rapidamente às mudanças de requisitos sem a necessidade de um processo complexo de migração de dados. No entanto, a desvantagem em alterar a estrutura de novos documentos é que os documentos existentes se tornam inconsistentes com o esquema atualizado. Portanto, este é um tema que precisa ser gerenciado com cuidado.
Observação: JSON significa Notação de Objeto JavaScript . É um formato de arquivo com uma estrutura legível por humanos que consiste em pares de valores-chave que podem ser aninhados arbitrariamente em profundidade.
MongoDB é escrito em C++ e desenvolvido ativamente pela MongoDB Inc. Ele roda em todas as principais plataformas, como macOS, Windows, Solaris e na maioria das distribuições Linux. Em geral, existem três objetivos principais de desenvolvimento por trás do banco de dados MongoDB:
- Escalar bem
- Armazenar estruturas de dados avançadas
- Forneça um mecanismo de consulta sofisticado
MongoDB é um distribuído banco de dados, portanto, alta disponibilidade, dimensionamento horizontal e distribuição geográfica são incorporados ao sistema. Ele armazena dados em documentos flexíveis do tipo JSON. Você pode modelar esses documentos para mapear os objetos em seus aplicativos, o que possibilita trabalhar com seus dados de forma eficaz.
O MongoDB fornece uma linguagem de consulta poderosa que suporta consultas ad hoc, indexação, agregação, pesquisa geoespacial, pesquisa de texto e muito mais. Isso apresenta um poderoso kit de ferramentas para acessar e trabalhar com seus dados. Por fim, o MongoDB está disponível gratuitamente e possui ótimo suporte ao Python.
Revisando os recursos do MongoDB
Até agora, você aprendeu o que é o MongoDB e quais são seus principais objetivos. Nesta seção, você aprenderá sobre alguns dos recursos mais importantes do MongoDB. Quanto ao lado do gerenciamento de banco de dados, o MongoDB oferece os seguintes recursos:
- Suporte a consultas: Você pode usar muitos tipos de consulta padrão, como correspondência (
==
), comparação (<
,>
) e expressões regulares. - Acomodação de dados: Você pode armazenar praticamente qualquer tipo de dados, sejam eles estruturados, parcialmente estruturados ou até polimórficos.
- Escalabilidade: Ele lida com mais consultas apenas adicionando mais máquinas ao cluster de servidores.
- Flexibilidade e agilidade: Você pode desenvolver aplicativos com ele rapidamente.
- Orientação de documentos e ausência de esquemas: Você pode armazenar todas as informações sobre um modelo de dados em um único documento.
- Esquema ajustável: Você pode alterar o esquema do banco de dados rapidamente, o que reduz o tempo necessário para fornecer novos recursos ou corrigir problemas existentes.
- Funcionalidades do banco de dados relacional: Você pode executar ações comuns a bancos de dados relacionais, como indexação.
Quanto ao lado das operações, o MongoDB fornece algumas ferramentas e recursos que você não encontrará em outros sistemas de banco de dados:
- Escalabilidade: Se você precisa de um servidor autônomo ou clusters completos de servidores independentes, você pode dimensionar o MongoDB para qualquer tamanho que você precisar.
- Suporte de balanceamento de carga: O MongoDB moverá dados automaticamente entre vários fragmentos.
- Suporte a failover automático: Se o servidor principal ficar inativo, um novo principal será instalado e executado automaticamente.
- Ferramentas de gerenciamento: Você pode rastrear suas máquinas usando o MongoDB Management Service (MMS) baseado em nuvem.
- Eficiência da memória: Graças aos arquivos mapeados em memória, o MongoDB geralmente é mais eficiente que os bancos de dados relacionais.
Todos esses recursos são bastante úteis. Por exemplo, se você aproveitar o recurso de indexação, muitos de seus dados serão mantidos na memória para recuperação rápida. Mesmo sem indexar chaves de documentos específicas, o MongoDB armazena em cache muitos dados usando a técnica menos usada recentemente.
Instalando e executando o MongoDB
Agora que você está familiarizado com o MongoDB, é hora de colocar a mão na massa e começar a usá-lo. Mas primeiro, você precisa instalá-lo em sua máquina. O site oficial do MongoDB fornece duas edições do servidor de banco de dados:
- A edição da comunidade oferece o modelo de documento flexível junto com consultas ad hoc, indexação e agregação em tempo real para fornecer maneiras poderosas de acessar e analisar seus dados. Esta edição está disponível gratuitamente.
- A edição empresarial oferece os mesmos recursos da edição da comunidade, além de outros recursos avançados relacionados à segurança e monitoramento. Esta é a edição comercial, mas você pode usá-la gratuitamente por tempo ilimitado para fins de avaliação e desenvolvimento.
Se você estiver no Windows, poderá ler o tutorial de instalação para obter instruções completas. Em geral, você pode ir para a página de download, selecionar a plataforma Windows na caixa Downloads Disponíveis, escolher o
.msi
instalador adequado ao seu sistema atual e clique em Baixar . Execute o instalador e siga as instruções na tela do assistente de instalação. Esta página também fornece informações sobre como executar o MongoDB como um serviço do Windows.
Se você estiver no macOS, poderá usar o Homebrew para instalar o MongoDB em seu sistema. Consulte o tutorial de instalação para obter o guia completo. Além disso, certifique-se de seguir as instruções para executar o MongoDB como um serviço macOS.
Se você estiver no Linux, o processo de instalação dependerá da sua distribuição específica. Para obter um guia detalhado sobre como instalar o MongoDB em diferentes sistemas Linux, acesse a página do tutorial de instalação e selecione o tutorial que corresponde ao seu sistema operacional atual. Certifique-se de executar o daemon do MongoDB,
mongod
, no final da instalação. Por fim, você também pode instalar o MongoDB usando o Docker. Isso é útil se você não quiser sobrecarregar seu sistema com outra instalação. Se você preferir esta opção de instalação, poderá ler o tutorial oficial e seguir suas instruções. Observe que o conhecimento prévio de como usar o Docker seria necessário nesse caso.
Com o banco de dados MongoDB instalado e rodando em seu sistema, você pode começar a trabalhar com bancos de dados reais usando o
mongo
Concha. Criando bancos de dados MongoDB com o mongo
Escudo
Se você seguiu as instruções de instalação e execução, já deve ter uma instância do MongoDB em execução em seu sistema. Agora você pode começar a criar e testar seus próprios bancos de dados. Nesta seção, você aprenderá a usar o
mongo
shell para criar, ler, atualizar e excluir documentos em um banco de dados. Executando o mongo
Escudo
O
mongo
shell é uma interface JavaScript interativa para o MongoDB. Você pode usar esta ferramenta para consultar e manipular seus dados, bem como para realizar operações administrativas. Como é uma interface JavaScript, você não usará a linguagem SQL familiar para consultar o banco de dados. Em vez disso, você usará o código JavaScript. Para iniciar o
mongo
shell, abra seu terminal ou linha de comando e execute o seguinte comando:$ mongo
Este comando leva você ao
mongo
Concha. Neste ponto, você provavelmente verá um monte de mensagens com informações sobre a versão do shell e sobre o endereço e a porta do servidor. Finalmente, você verá o prompt do shell (>
) para inserir consultas e comandos. Você pode passar o endereço do banco de dados como um argumento para o
mongo
comando. Você também pode usar várias opções, como especificar o host e a porta para acessar um banco de dados remoto e assim por diante. Para mais detalhes sobre como usar o mongo
comando, você pode executar mongo --help
. Estabelecer uma conexão
Quando você executa o
mongo
comando sem argumentos, ele inicia o shell e se conecta ao servidor local padrão fornecido pelo mongod
processo em mongod://127.0.0.1:27017
. Isso significa que você está conectado ao host local pela porta 27017
. Por padrão, o
mongo
shell inicia a sessão estabelecendo uma conexão com o test
base de dados. Você pode acessar o banco de dados atual através do db
objeto:> db
test
>
Neste caso,
db
contém uma referência a test
, que é o banco de dados padrão. Para alternar bancos de dados, emita o comando use
, fornecendo um nome de banco de dados como argumento. Por exemplo, digamos que você queira criar um site para publicar conteúdo Python e planeja usar o MongoDB para armazenar seus tutoriais e artigos. Nesse caso, você pode alternar para o banco de dados do site com o seguinte comando:
> use rptutorials
switched to db rptutorials
Este comando muda sua conexão para o
rptutorials
base de dados. O MongoDB não cria o arquivo de banco de dados físico no sistema de arquivos até que você insira dados reais no banco de dados. Então, neste caso, rptutorials
não aparecerá na sua lista de banco de dados atual:> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
>
O
mongo
shell fornece muitos recursos e opções. Ele permite que você consulte e manipule seus dados e também gerencie o próprio servidor de banco de dados. Em vez de usar uma linguagem de consulta padronizada como SQL, o
mongo
shell usa a linguagem de programação JavaScript e uma API amigável. Essa API permite que você brinque com seus dados, que é o tópico da próxima seção. Criando coleções e documentos
Um banco de dados MongoDB é um contêiner físico para coleções de documentos. Cada banco de dados obtém seu próprio conjunto de arquivos no sistema de arquivos. Esses arquivos são gerenciados pelo servidor MongoDB, que pode lidar com vários bancos de dados.
No MongoDB, uma coleção é um grupo de documentos . As coleções são um tanto análogas às tabelas em um RDBMS tradicional, mas sem impor um esquema rígido. Em teoria, cada documento em uma coleção pode ter uma estrutura ou conjunto de campos completamente diferente.
Na prática, os documentos em uma coleção geralmente compartilham uma estrutura semelhante para permitir processos uniformes de recuperação, inserção e atualização. Você pode impor uma estrutura de documento uniforme usando regras de validação de documento durante atualizações e inserções.
Permitir diferentes estruturas de documentos é um recurso chave das coleções do MongoDB. Esse recurso oferece flexibilidade e permite adicionar novos campos aos documentos sem a necessidade de modificar um esquema de tabela formal.
Para criar uma coleção usando o
mongo
shell, você precisa apontar db
para seu banco de dados de destino e, em seguida, crie as coleções usando a notação de ponto :> use rptutorials
switched to db rptutorials
> db
rptutorials
> db.tutorial
rptutorials.tutorial
Neste exemplo, você usa a notação de ponto para criar
tutorial
como uma coleção em rptutorials
, que é seu banco de dados atual. É importante observar que o MongoDB cria bancos de dados e coleções preguiçosamente . Em outras palavras, eles são criados fisicamente somente depois que você insere o primeiro documento. Depois de ter um banco de dados e uma coleção, você pode começar a inserir documentos. Documentos são a unidade de armazenamento no MongoDB. Em um RDBMS, isso seria equivalente a uma linha de tabela. No entanto, os documentos do MongoDB são muito mais versáteis do que linhas porque podem armazenar informações complexas, como matrizes, documentos incorporados e até matrizes de documentos.
O MongoDB armazena documentos em um formato chamado JSON binário (BSON), que é uma representação binária de JSON. Os documentos do MongoDB são compostos de pares de campo e valor e possuem a seguinte estrutura:
{
field1 → value1,
field2 → value2,
field3 → value3,
...
fieldN → valueN
}
O valor de um campo pode ser qualquer tipo de dados BSON, incluindo outros documentos, matrizes e matrizes de documentos. Na prática, você especificará seus documentos usando o formato JSON.
Quando você está construindo um aplicativo de banco de dados MongoDB, provavelmente sua decisão mais importante é sobre a estrutura dos documentos. Em outras palavras, você terá que decidir quais campos e valores seus documentos terão.
No caso dos tutoriais para seu site Python, seus documentos podem ser estruturados assim:
{
"title": "Reading and Writing CSV Files in Python",
"author": "Jon",
"contributors": [
"Aldren",
"Geir Arne",
"Joanna",
"Jason"
],
"url": "https://realpython.com/python-csv/"
}
Um documento é essencialmente um conjunto de nomes de propriedades e seus valores. Os valores podem ser tipos de dados simples, como strings e números, mas também podem ser arrays, como
contributors
no exemplo acima. O modelo de dados orientado a documentos do MongoDB representa naturalmente dados complexos como um único objeto. Isso permite que você trabalhe com objetos de dados de forma holística, sem a necessidade de consultar vários locais ou tabelas.
Se você estivesse usando um RDBMS tradicional para armazenar seus tutoriais, provavelmente teria uma tabela para armazenar seus tutoriais e outra tabela para armazenar seus contribuidores. Então você teria que configurar um relacionamento entre as duas tabelas para poder recuperar os dados mais tarde.
Trabalhando com coleções e documentos
Até agora, você conhece o básico de como executar e usar o
mongo
Concha. Você também sabe como criar seus próprios documentos usando o formato JSON. Agora é hora de aprender como inserir documentos em seu banco de dados MongoDB. Para inserir um documento em um banco de dados usando o
mongo
shell, primeiro você precisa escolher uma coleção e então chamar .insertOne()
na coleção com seu documento como argumento:> use rptutorials
switched to db rptutorials
> db.tutorial.insertOne({
... "title": "Reading and Writing CSV Files in Python",
... "author": "Jon",
... "contributors": [
... "Aldren",
... "Geir Arne",
... "Joanna",
... "Jason"
... ],
... "url": "https://realpython.com/python-csv/"
... })
{
"acknowledged" : true,
"insertedId" : ObjectId("600747355e6ea8d224f754ba")
}
Com o primeiro comando, você alterna para o banco de dados que deseja usar. O segundo comando é uma chamada de método JavaScript que insere um documento simples na coleção selecionada,
tutorial
. Depois de pressionar Enter , você recebe uma mensagem na tela informando sobre o documento recém-inserido e seu insertedId
. Assim como os bancos de dados relacionais precisam de uma chave primária para identificar exclusivamente cada linha em uma tabela, os documentos do MongoDB precisam ter um
_id
campo que identifica exclusivamente o documento. O MongoDB permite que você insira um _id
personalizado desde que você garanta a sua singularidade. No entanto, uma prática amplamente aceita é permitir que o MongoDB insira automaticamente um _id
para você. Da mesma forma, você pode adicionar vários documentos de uma só vez usando
.insertMany()
:> tutorial1 = {
... "title": "How to Iterate Through a Dictionary in Python",
... "author": "Leodanis",
... "contributors": [
... "Aldren",
... "Jim",
... "Joanna"
... ],
... "url": "https://realpython.com/iterate-through-dictionary-python/"
... }
> tutorial2 = {
... "title": "Python 3's f-Strings: An Improved String Formatting Syntax",
... "author": "Joanna",
... "contributors": [
... "Adriana",
... "David",
... "Dan",
... "Jim",
... "Pavel"
... ],
... "url": "https://realpython.com/python-f-strings/"
... }
> db.tutorial.insertMany([tutorial1, tutorial2])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("60074ff05e6ea8d224f754bb"),
ObjectId("60074ff05e6ea8d224f754bc")
]
}
Aqui, a chamada para
.insertMany()
pega uma lista de tutoriais e os insere no banco de dados. Novamente, a saída do shell mostra informações sobre os documentos recém-inseridos e seus _id
adicionados automaticamente Campos. O
mongo
shell também fornece métodos para executar operações de leitura, atualização e exclusão no banco de dados. Por exemplo, você pode usar .find()
para recuperar os documentos em uma coleção:> db.tutorial.find()
{ "_id" : ObjectId("600747355e6ea8d224f754ba"),
"title" : "Reading and Writing CSV Files in Python",
"author" : "Jon",
"contributors" : [ "Aldren", "Geir Arne", "Joanna", "Jason" ],
"url" : "https://realpython.com/python-csv/" }
...
> db.tutorial.find({author: "Joanna"})
{ "_id" : ObjectId("60074ff05e6ea8d224f754bc"),
"title" : "Python 3's f-Strings: An Improved String Formatting Syntax (Guide)",
"author" : "Joanna",
"contributors" : [ "Adriana", "David", "Dan", "Jim", "Pavel" ],
"url" : "https://realpython.com/python-f-strings/" }
A primeira chamada para
.find()
recupera todos os documentos no tutorial
coleção. Por outro lado, a segunda chamada para .find()
recupera os tutoriais de autoria de Joanna. Com este conhecimento prévio sobre como usar o MongoDB através de seu
mongo
shell, você está pronto para começar a usar o MongoDB com Python. As próximas seções o guiarão pelas diferentes opções para usar bancos de dados MongoDB em seus aplicativos Python. Usando MongoDB com Python e PyMongo
Agora que você sabe o que é MongoDB e como criar e gerenciar bancos de dados usando o
mongo
shell, você pode começar a usar o MongoDB, mas desta vez com o Python. O MongoDB fornece um driver Python oficial chamado PyMongo. Nesta seção, você verá alguns exemplos que o ajudarão a ter uma ideia de como usar o PyMongo para criar seus próprios aplicativos de banco de dados com MongoDB e Python.
Cada módulo dentro do PyMongo é responsável por um conjunto de operações no banco de dados. Você terá módulos para pelo menos as seguintes tarefas:
- Estabelecer conexões de banco de dados
- Trabalhando com bancos de dados
- Trabalhar com coleções e documentos
- Manipulação do cursor
- Trabalhando com criptografia de dados
Em geral, o PyMongo fornece um rico conjunto de ferramentas que você pode usar para se comunicar com um servidor MongoDB. Ele fornece funcionalidade para consultar, recuperar resultados, gravar e excluir dados e executar comandos de banco de dados.
Instalando o PyMongo
Para começar a usar o PyMongo, primeiro você precisa instalá-lo em seu ambiente Python. Você pode usar um ambiente virtual ou pode usar a instalação do Python em todo o sistema, embora a primeira opção seja a preferida. O PyMongo está disponível no PyPI, então a maneira mais rápida de instalá-lo é com
pip
. Abra seu terminal e execute o seguinte comando:$ pip install pymongo==3.11.2
Após alguns downloads e outras etapas relacionadas, este comando instala o PyMongo em seu ambiente Python. Observe que, se você não fornecer um número de versão específico,
pip
instalará a versão mais recente disponível. Observação: Para um guia completo sobre como instalar o PyMongo, confira a página de instalação/atualização de sua documentação oficial.
Depois de concluir a instalação, você pode iniciar uma sessão interativa do Python e executar a seguinte importação:
>>>
>>> import pymongo
Se isso for executado sem gerar uma exceção no shell do Python, sua instalação funcionará bem. Caso contrário, execute cuidadosamente as etapas novamente.
Estabelecer uma conexão
Para estabelecer uma conexão com um banco de dados, você precisa criar um
MongoClient
instância. Essa classe fornece um cliente para uma instância ou servidor do MongoDB. Cada objeto de cliente tem um pool de conexões integrado, que por padrão lida com até cem conexões com o servidor. Volte para sua sessão interativa do Python e importe
MongoClient
de pymongo
. Em seguida, crie um objeto cliente para se comunicar com sua instância MongoDB em execução no momento:>>>
>>> from pymongo import MongoClient
>>> client = MongoClient()
>>> client
MongoClient(host=['localhost:27017'], ..., connect=True)
O código acima estabelece uma conexão com o host padrão (
localhost
) e porta (27017
). MongoClient
recebe um conjunto de argumentos que permite especificar host, porta e outros parâmetros de conexão personalizados. Por exemplo, para fornecer um host e uma porta personalizados, você pode usar o seguinte código:>>>
>>> client = MongoClient(host="localhost", port=27017)
Isso é útil quando você precisa fornecer um
host
e port
que diferem da configuração padrão do MongoDB. Você também pode usar o formato de URI do MongoDB:>>>
>>> client = MongoClient("mongodb://localhost:27017")
Todas essas instâncias de
MongoClient
forneça a mesma configuração de cliente para conectar sua instância atual do MongoDB. Qual deles você deve usar depende apenas de quão explícito você deseja ser em seu código. Depois de instanciar o
MongoClient
, você pode usar sua instância para se referir a essa conexão de banco de dados específica, assim como você fez com o mongo
db
do shell objeto na seção acima. Trabalhando com bancos de dados, coleções e documentos
Depois de ter uma instância conectada de
MongoClient
, você pode acessar qualquer banco de dados gerenciado pelo servidor MongoDB especificado. Para definir qual banco de dados você deseja usar, você pode usar a notação de ponto como fez no mongo
Concha:>>>
>>> db = client.rptutorials
>>> db
Database(MongoClient(host=['localhost:27017'], ..., connect=True), 'rptutorials')
Neste caso,
rptutorials
é o nome do banco de dados com o qual você trabalhará. Se o banco de dados não existir, o MongoDB o criará para você, mas somente quando você realizar a primeira operação no banco de dados. Você também pode usar o acesso estilo dicionário se o nome do banco de dados não for um identificador Python válido:
>>>
>>> db = client["rptutorials"]
Esta instrução é útil quando o nome do seu banco de dados não é um identificador Python válido. Por exemplo, se seu banco de dados se chama
rp-tutorials
, você precisará usar o acesso no estilo de dicionário. Observação: Quando você usa o
mongo
shell, você tem acesso ao banco de dados através do db
objeto global. Ao usar o PyMongo, você pode atribuir o banco de dados a uma variável chamada db
para obter um comportamento semelhante. Armazenar dados em seu banco de dados usando PyMongo é semelhante ao que você fez com o
mongo
shell nas seções acima. Mas primeiro, você precisa criar seus documentos. Em Python, você usa dicionários para criar documentos:>>>
>>> tutorial1 = {
... "title": "Working With JSON Data in Python",
... "author": "Lucas",
... "contributors": [
... "Aldren",
... "Dan",
... "Joanna"
... ],
... "url": "https://realpython.com/python-json/"
... }
Depois de criar o documento como um dicionário, você precisa especificar qual coleção deseja usar. Para fazer isso, você pode usar a notação de ponto no objeto de banco de dados:
>>>
>>> tutorial = db.tutorial
>>> tutorial
Collection(Database(..., connect=True), 'rptutorials'), 'tutorial')
Neste caso,
tutorial
é uma instância de Collection
e representa uma coleção física de documentos em seu banco de dados. Você pode inserir documentos em tutorial
chamando .insert_one()
nele com um documento como argumento:>>>
>>> result = tutorial.insert_one(tutorial1)
>>> result
<pymongo.results.InsertOneResult object at 0x7fa854f506c0>
>>> print(f"One tutorial: {result.inserted_id}")
One tutorial: 60084b7d87eb0fbf73dbf71d
Aqui,
.insert_one()
leva tutorial1
, insere-o no tutorial
coleção e retorna um InsertOneResult
objeto. Este objeto fornece feedback sobre o documento inserido. Observe que, como o MongoDB gera o ObjectId
dinamicamente, sua saída não corresponderá ao ObjectId
Mostrado acima. Se você tiver muitos documentos para incluir no banco de dados, poderá usar
.insert_many()
para inseri-los de uma só vez:>>>
>>> tutorial2 = {
... "title": "Python's Requests Library (Guide)",
... "author": "Alex",
... "contributors": [
... "Aldren",
... "Brad",
... "Joanna"
... ],
... "url": "https://realpython.com/python-requests/"
... }
>>> tutorial3 = {
... "title": "Object-Oriented Programming (OOP) in Python 3",
... "author": "David",
... "contributors": [
... "Aldren",
... "Joanna",
... "Jacob"
... ],
... "url": "https://realpython.com/python3-object-oriented-programming/"
... }
>>> new_result = tutorial.insert_many([tutorial2, tutorial3])
>>> print(f"Multiple tutorials: {new_result.inserted_ids}")
Multiple tutorials: [
ObjectId('6008511c87eb0fbf73dbf71e'),
ObjectId('6008511c87eb0fbf73dbf71f')
]
Isso é mais rápido e direto do que chamar
.insert_one()
várias vezes. A chamada para .insert_many()
pega um iterável de documentos e os insere no tutorial
coleção em seus rptutorials
base de dados. O método retorna uma instância de InsertManyResult
, que fornece informações sobre os documentos inseridos. Para recuperar documentos de uma coleção, você pode usar
.find()
. Sem argumentos, .find()
retorna um Cursor
objeto que cede os documentos da coleção sob demanda:>>>
>>> import pprint
>>> for doc in tutorial.find():
... pprint.pprint(doc)
...
{'_id': ObjectId('600747355e6ea8d224f754ba'),
'author': 'Jon',
'contributors': ['Aldren', 'Geir Arne', 'Joanna', 'Jason'],
'title': 'Reading and Writing CSV Files in Python',
'url': 'https://realpython.com/python-csv/'}
...
{'_id': ObjectId('6008511c87eb0fbf73dbf71f'),
'author': 'David',
'contributors': ['Aldren', 'Joanna', 'Jacob'],
'title': 'Object-Oriented Programming (OOP) in Python 3',
'url': 'https://realpython.com/python3-object-oriented-programming/'}
Here, you run a loop on the object that
.find()
returns and print successive results, using pprint.pprint()
to provide a user-friendly output format. You can also use
.find_one()
to retrieve a single document. In this case, you can use a dictionary that contains fields to match. For example, if you want to retrieve the first tutorial by Jon, then you can do something like this:>>>
>>> import pprint
>>> jon_tutorial = tutorial.find_one({"author": "Jon"})
>>> pprint.pprint(jon_tutorial)
{'_id': ObjectId('600747355e6ea8d224f754ba'),
'author': 'Jon',
'contributors': ['Aldren', 'Geir Arne', 'Joanna', 'Jason'],
'title': 'Reading and Writing CSV Files in Python',
'url': 'https://realpython.com/python-csv/'}
Note that the tutorial’s
ObjectId
is set under the _id
key, which is the unique document identifier that MongoDB automatically adds when you insert a document into your database. PyMongo also provides methods to replace, update, and delete documents from a database. If you want to dive deeper into these features, then take a look at the documentation for
Collection
. Closing Connections
Establishing a connection to a MongoDB database is typically an expensive operation. If you have an application that constantly retrieves and manipulates data in a MongoDB database, then you probably don’t want to be opening and closing the connection all the time since this might affect your application’s performance.
In this kind of situation, you should keep your connection alive and only close it before exiting the application to clear all the acquired resources. You can close the connection by calling
.close()
on the MongoClient
instance:>>>
>>> client.close()
Another situation is when you have an application that occasionally uses a MongoDB database. In this case, you might want to open the connection when needed and close it immediately after use for freeing the acquired resources. A consistent approach to this problem would be to use the
with
demonstração. Yes, MongoClient
implements the context manager protocol:>>>
>>> import pprint
>>> from pymongo import MongoClient
>>> with MongoClient() as client:
... db = client.rptutorials
... for doc in db.tutorial.find():
... pprint.pprint(doc)
...
{'_id': ObjectId('600747355e6ea8d224f754ba'),
'author': 'Jon',
'contributors': ['Aldren', 'Geir Arne', 'Joanna', 'Jason'],
'title': 'Reading and Writing CSV Files in Python',
'url': 'https://realpython.com/python-csv/'}
...
{'_id': ObjectId('6008511c87eb0fbf73dbf71f'),
'author': 'David',
'contributors': ['Aldren', 'Joanna', 'Jacob'],
'title': 'Object-Oriented Programming (OOP) in Python 3',
'url': 'https://realpython.com/python3-object-oriented-programming/'}
If you use the
with
statement to handle your MongoDB client, then at the end of the with
code block, the client’s .__exit__()
method gets called, which at the same time closes the connection by calling .close()
. Using MongoDB With Python and MongoEngine
While PyMongo is a great and powerful Python driver for interfacing with MongoDB, it’s probably a bit too low-level for many of your projects. With PyMongo, you’ll have to write a lot of code to consistently insert, retrieve, update, and delete documents.
One library that provides a higher abstraction on top of PyMongo is MongoEngine. MongoEngine is an object-document mapper (ODM), which is roughly equivalent to an SQL-based object-relational mapper (ORM). MongoEngine provides a class-based abstraction, so all the models you create are classes.
Installing MongoEngine
There are a handful of Python libraries to help you work with MongoDB. MongoEngine, however, is a popular one that provides a nice set of features, flexibility, and community support. MongoEngine is available on PyPI. You can install it using the following
pip
comando:$ pip install mongoengine==0.22.1
Once you’ve installed MongoEngine into your Python environment, you’re ready to start working with MongoDB databases using Python’s object-oriented features. The next step is to connect to your running MongoDB instance.
Establishing a Connection
To establish a connection with your database, you need to use
mongoengine.connect()
. This function takes several arguments. However, in this tutorial, you’ll use only three of them. Within your Python interactive session, type the following code:>>>
>>> from mongoengine import connect
>>> connect(db="rptutorials", host="localhost", port=27017)
MongoClient(host=['localhost:27017'], ..., read_preference=Primary())
Here, you first set the database name
db
to "rptutorials"
, which is the name of the database you want to work in. Then you provide a host
and a port
to connect to your current MongoDB instance. Since you’re using the default host
and port
, you can omit these two parameters and just use connect("rptutorials")
. Working With Collections and Documents
To create documents with MongoEngine, you first need to define what data you want the documents to have. In other words, you need to define a document schema. MongoEngine encourages you to define a document schema to help you reduce coding errors and to allow you to define utility or helper methods.
Similar to ORMs, ODMs like MongoEngine provide a base or model class for you to define a document schema. In ORMs, that class is equivalent to a table, and its instances are equivalent to rows. In MongoEngine, the class is equivalent to a collection, and its instances are equivalent to documents.
To create a model, you need to subclass
Document
and provide the required fields as class attributes. To continue with the blog example, here’s how you can create a model for your tutorials:>>>
>>> from mongoengine import Document, ListField, StringField, URLField
>>> class Tutorial(Document):
... title = StringField(required=True, max_length=70)
... author = StringField(required=True, max_length=20)
... contributors = ListField(StringField(max_length=20))
... url = URLField(required=True)
With this model, you tell MongoEngine that you expect a
Tutorial
document to have a .title
, an .author
, a list of .contributors
, and a .url
. The base class, Document
, uses that information along with the field types to validate the input data for you. Note: One of the more difficult tasks with database models is data validation . How do you make sure that the input data conforms to your format requirements? That’s one of the reasons for you to have a coherent and uniform document schema.
MongoDB is said to be a schemaless database, but that doesn’t mean it’s schema free. Having documents with a different schema within the same collection can lead to processing errors and inconsistent behavior.
For example, if you try to save a
Tutorial
object without a .title
, then your model throws an exception and lets you know. You can take this even further and add more restrictions, such as the length of the .title
, and so on. There are a few general parameters that you can use to validate fields. Here are some of the more commonly used parameters:
db_field
specifies a different field name.required
ensures that the field is provided.default
provides a default value for a given field if no value is given.unique
ensures that no other document in the collection has the same value for this field.
Each specific field type also has its own set of parameters. You can check the documentation for a complete guide to the available field types.
To save a document to your database, you need to call
.save()
on a document object. If the document already exists, then all the changes will be applied to the existing document. If the document doesn’t exist, then it’ll be created. Here’s an example of creating and saving a tutorial into your sample tutorials database:
>>>
>>> tutorial1 = Tutorial(
... title="Beautiful Soup: Build a Web Scraper With Python",
... author="Martin",
... contributors=["Aldren", "Geir Arne", "Jaya", "Joanna", "Mike"],
... url="https://realpython.com/beautiful-soup-web-scraper-python/"
... )
>>> tutorial1.save() # Insert the new tutorial
<Tutorial: Tutorial object>
By default,
.save()
inserts the new document into a collection named after the model class, Tutorial
, except using lowercase letters. In this case, the collection name is tutorial
, which matches the collection you’ve been using to save your tutorials. PyMongo performs data validation when you call
.save()
. This means that it checks the input data against the schema you declared in the Tutorial
model class. If the input data violates the schema or any of its constraints, then you get an exception, and the data isn’t saved into the database. For example, here’s what happens if you try to save a tutorial without providing a
.title
:>>>
>>> tutorial2 = Tutorial()
>>> tutorial2.author = "Alex"
>>> tutorial2.contributors = ["Aldren", "Jon", "Joanna"]
>>> tutorial2.url = "https://realpython.com/convert-python-string-to-int/"
>>> tutorial2.save()
Traceback (most recent call last):
...
mongoengine.errors.ValidationError: ... (Field is required: ['title'])
In this example, first note that you can also build a
Tutorial
object by assigning values to its attributes. Second, since you don’t provide a .title
for the new tutorial, .save()
raises a ValidationError
telling you that the .title
field is required. Having automatic data validation is a great feature that will save you some headaches. Each
Document
subclass has an .objects
attribute that you can use to access the documents in the associated collection. For example, here’s how you can print the .title
of all your current tutorials:>>>
>>> for doc in Tutorial.objects:
... print(doc.title)
...
Reading and Writing CSV Files in Python
How to Iterate Through a Dictionary in Python
Python 3's f-Strings: An Improved String Formatting Syntax (Guide)
Working With JSON Data in Python
Python's Requests Library (Guide)
Object-Oriented Programming (OOP) in Python 3
Beautiful Soup: Build a Web Scraper With Python
The
for
loop iterates over all your tutorials and prints their .title
data to the screen. You can also use .objects
to filter your documents. For example, say you want to retrieve the tutorials authored by Alex. In that case, you can do something like this:>>>
>>> for doc in Tutorial.objects(author="Alex"):
... print(doc.title)
...
Python's Requests Library (Guide)
MongoEngine is well suited to manage your MongoDB databases for just about any type of application. Its features make it ideal for creating efficient and scalable programs using a high-level approach. If you’re looking for more information about MongoEngine, be sure to check out its user guide.
Conclusion
If you need a robust, scalable, and flexible database solution, then MongoDB might be a good option for you. MongoDB is a mature and popular NoSQL database with great Python support. With a good understanding of how to access MongoDB with Python, you’ll be ready to create database applications that scale well and provide excellent performance.
With MongoDB, you also have the benefit of a human-readable and highly-flexible data model, so you can adapt to requirement changes quickly.
In this tutorial, you learned:
- What MongoDB and NoSQL databases are
- How to install and run MongoDB on your system
- How to create and work with MongoDB databases
- How to interface with MongoDB in Python using the PyMongo driver
- How to use the MongoEngine object-document mapper to work with MongoDB
The examples you coded in this tutorial are available for download. To get their source code, click the link below:
Get the Source Code: Click here to get the source code you’ll use to learn about using MongoDB with Python in this tutorial.