Trabalhando com Python e MongoDB

A conexão do mongodb com o python é realizada de uma maneira muito simples, como na maioria das linguagens, temos uma lib para facilitar o processo, no python temos a pymongo, para instalá-la basta:

$ pip install pymongo

Conectando

Com tudo devidamente instalado, a conexão resume-se à:

>>> from pymongo import MongoClient

Para realizar a conexão você tem duas opções, na primeira você indica o host e a porta, dessa forma:

>>> cliente = MongoClient('localhost', 27017)

E na segunda, você passa uma URL, dessa forma:

>>> cliente = MongoClient('mongodb://localhost:27017/')

As duas formas funcionarão exatamente igual.

OBS: A porta padrão do mongodb é a 27017.

Selecionando um banco

Com a conexão feita, é hora de selecionarmos um banco para trabalhar, temos duas formas de fazer isso, selecionando explicitamente:

>>> banco = cliente.test_database

Ou usando o estilo de acesso dos dicionários:

>>> banco = cliente['test-database']

As duas formas funcionarão exatamente igual.

Coleções

Coleções ou (Collections) estão para o mongodb como tabelas estão para bancos relacionais como postgres ou mysql. Collections são grupos de documentos armazenados no mongodb, é nelas onde os dados serão armazenados, a selecão de uma collection é feita da seguinte forma:

>>> album = banco.test_collection

Como na seleção do banco, podemos usar também o estilo de acesso dos dicionários:

>>> album = banco['test-collection']

Documentos

Dados no mongodb são representados e armazenados usando o estilo de documentos JSON, no pymongo podemos representar um dicionário do python como é mostrado abaixo:

>>> import datetime
>>> musica = {
"nome": "Nothing left to say",
"banda": "Imagine Dragons",
"categorias": ["indie", "rock"],
"lancamento": datetime.datetime.now()
}

Note que esses documentos podem conter listas, além de tipos nativos do python, no caso uma instância de datetime.datetime.

Inserindo um documento

Para inserir um documento em uma collection usamos o método insert_one().

>>> album = banco.album
>>> musica_id = album.insert_one(musica).inserted_id
>>> musica_id
ObjectId('558864231d41c82b8badf9b5')

Quando um documento é inserido, um “ObjectId” é criado, se você não especificar um “_id” em seu documento, será atribuido um valor aleatório ao seu ObjectId, veja no exemplo:

import datetime
>>> musica = {
"_id": 12345,
"nome": "Nothing lef to say",
"banda": "Imagine Dragons",
"categorias": ["indie", "rock"],
"lancamento": datetime.datetime.now()
}

E ao inserir o novo documento o ObjectId retornado foi o especificado acima:

>>> musica_id = album.insert_one(musica).inserted_id
>>> musica_id
12345

Também podemos inserir mais de um documento, dessa forma:

>>> import datetime
>>> musicas = [
{
"_id": 1,
"nome": "Radioactive",
"banda": "Imagine Dragons",
"categorias": ["indie", "rock"],
"lancamento": datetime.datetime.now()
},
{
"_id": 2,
"nome": "Hear Me",
"banda": "Imagine Dragons",
"categorias": ["indie", "rock"],
"lancamento": datetime.datetime.now()
},
{
"_id": 3,
"nome": "Demons",
"banda": "Imagine Dragons",
"categorias": ["indie", "rock"],
"lancamento": datetime.datetime.now()
},
{
"_id": 4,
"nome": "Nothing Left To Say",
"banda": "Imagine Dragons",
"categorias": ["indie", "rock"],
"lancamento": datetime.datetime.now()
},
{
"_id": 5,
"nome": "Amsterdam",
"banda": "Imagine Dragons",
"categorias": ["indie", "rock"],
"lancamento": datetime.datetime.now()
}
]
>>> album.insert_many(musicas)

Buscas com find_one()

A query mais básica presente no mongodb é a find_one, este método retorna um único documento ou None, se o mesmo não existir na collection:

>>> album.find_one()
{
u'banda': u'Imagine Dragons',
u'_id': 1,
u'categorias': [u'indie', u'rock'],
u'lancamento': datetime.datetime(2015, 6, 22, 18, 14, 24, 5000),
u'nome': u'Radioactive'
}

também podemos passar filtros:

>>> album.find_one({"nome": "Radioactive"})
{
u'banda': u'Imagine Dragons',
u'_id': 1,
u'categorias': [u'indie', u'rock'],
u'lancamento': datetime.datetime(2015, 6, 22, 18, 14, 24, 5000),
u'nome': u'Radioactive'
}

No exemplo acima a query retorna a música com o nome Radioactive.

Buscas por ObjectId

Também podemos realizar buscas por ObjectId, dessa forma:

>>> album.find_one({"_id": 1})
{
u'banda': u'Imagine Dragons',
u'_id': 1,
u'categorias': [u'indie', u'rock'],
u' lancamento': datetime.datetime(2015, 6, 22, 18, 14, 24, 5000),
u'nome': u'Radioactive'
}

E para pesquisas com mais de um item por vez? Isso pode ser feito dessa forma.

>>> for musica_id in range(album.count()):
album.find_one({"_id": musica_id})

Atualizando documentos

A maneira mais simples de atualizar documentos de uma coleção é da seguinte forma:

>>> album.update_one({'_id': 2}, {'$set': {'nome':'Novo nome'}})

No exemplo acima, a musica com id 2 será renomeada, atente-se para o operador $set, dependendo do tipo de dado trabalhado o mesmo pode ser alterado, segue uma lista para não se perder na hora de utilizá-los.

>>> album.update_many({'banda': 'Imagine Dragons'}, {'$set': {'nome':'Novo nome'}})

Quando desejamos atualizar mais de um objeto, temos a nossa disposição método update_many, no exemplo acima todas as musicas da banda Imagine Dragons serão renomeadas.

Deletando documentos

A maneira mais simples de se remover documentos de uma coleção é da seguinte forma:

>>> album.delete_one({"_id": 1})

No exemplo acima a musica com o id 1 será apagada.

>>> album.delete_many({"banda": "Imagine Dragons"})

Quando desejamos apagar mais de um objeto, temos a nossa disposição método delete_many, no exemplo acima todas as musicas da banda Imagine Dragons serão apagadas.

Simples não?

Conclusão

Nosql vem ganhando bastante espaço no mercado nos últimos anos, não só mongodb, mais bancos como redis e cassandra ganham cada vez mais adéptos, deixando bem claro aqui que bancos nosql não são melhores nem piores do que os relacionais, são apenas um novo conceito.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.