O documento resume as principais características e funcionalidades do MongoDB, um banco de dados não relacional, e como utilizá-lo junto com a linguagem Python. O documento discute como modelar e realizar consultas de dados no MongoDB usando Python e módulos como PyMongo e MongoEngine.
1. Python e MongoDB
Christiano Anderson
Twitter: @dump
Blog: http://christiano.me
Email: anderson@gonow.com.br
Site: http://www.gonow.com.br
2. • Trabalha com software livre desde 1995;
• Gerente de Projetos da Gonow;
• Desenvolvedor do Projeto GNU (FSF);
• Trabalha com Python desde 2000;
• Membro da equipe de tradução do
MongoDB;
• Evangelista NoSQL;
5. O que é MongoDB?
Banco de dados não relacional
Software Livre
6. O que é MongoDB?
Banco de dados não relacional
Software Livre
Alta performance
7. O que é MongoDB?
Banco de dados não relacional
Software Livre
Alta performance
Schema free
8. O que é MongoDB?
Banco de dados não relacional
Software Livre
Alta performance
Orientado a documentos
Schema free
9. “MongoDB preenche a lacuna entre modelagem chave/
valor (o que são bem rápidas e escaláveis) e os
tradicionais banco de dados relacionais (que oferecem
várias funcionalidades)”
24. Modelo de documento
{‘nome’: ‘Christiano’,
‘linguagem’: ‘Python’,
‘nota’: 10}
25. Modelo de documento
{‘nome’: ‘Christiano’,
‘linguagem’: ‘Python’,
‘nota’: 10}
Sim, é um JSON.
É muito fácil trabalhar com esse modelo de dados em
praticamente qualquer linguagem
32. Migrations?
Você pode mudar dinamicamente seu documento...
{‘nome’: ‘Christiano’,
{‘nome’: ‘Christiano’,
‘linguagem’: ‘Python’,
‘linguagem’: ‘Python’,
‘nota’: 10,
‘nota’: 10}
‘local’: ‘Gonow’}
Você não precisa modificar o modelo de
dados para adicionar novos elementos.
Basta inserir e salvar novamente!
38. Map/Reduce
É utilizado para criar funções especiais, pode ser
comparado a uma stored procedure
39. Map/Reduce
É utilizado para criar funções especiais, pode ser
comparado a uma stored procedure
Utiliza-se JavaScript para criar essas funções
40. Map/Reduce
É utilizado para criar funções especiais, pode ser
comparado a uma stored procedure
Utiliza-se JavaScript para criar essas funções
Bastante flexível
41. Exemplo de Map/Reduce para contar tags repetidas
function() {
this.tags.forEach(function(z)) {
emit(z, 1);
});}
function(key, value) {
var total = 0;
for(var i = 0; i < values.length; i++) {
total += values[i]; }
return total;
}
42. Comparando SQL e MongoDB 1/2
SQL MongoDB
INSERT INTO USERS VALUES(1,1) db.users.insert({a:1, b:1})
SELECT a,b FROM users db.users.find({}, {a: 1, b: 1})
SELECT * FROM users db.users.find()
SELECT * FROM users WHERE age=33 db.users.find({age: 33})
SELECT * FROm users WHERE name = “pedro” db.users.find({name:”pedro”})
43. Comparando SQL e MongoDB 2/2
SQL MongoDB
SELECT * FROM users WHERE db.users.find({‘age’:33}).sort({name:
age=33 ORDER BY name 1})
SELECT * FROM users WHERE age
db.users.find({‘age’:{$lt:33}})})
< 33
CREATE INDEX myindexname ON
db.users.ensureIndex({name:1})
user(name)
SELECT * FROM users WHERE a = 1 AND b =
‘q’ db.users.find({a:1, b:’q’})
SELECT * FROM users LIMIT 10 SKIP 20 db.users.find().limit(10).skip(20)
47. Outros recursos bacanas
Suporte a índices;
GridFS;
Replicação de dados;
Alta disponibilidade;
48. Outros recursos bacanas
Suporte a índices;
GridFS;
Replicação de dados;
Alta disponibilidade;
É software livre, mas também oferece suporte
comercial!
53. Exemplo de uso
>>> from pymongo import Connection
>>> con = Connection(‘localhost’)
>>> db = con[‘blog’]
54. Inserindo um registro
>>> post = {‘title’:‘Meu Primeiro Post’,
... ‘author’:‘Christiano Anderson’,
... ‘content’: ‘Esse eh um exemplo de conteudo’,
... ‘tags’: [‘mongodb’,‘paraiba’,‘evento’,‘ensol’]}
>>> post = db[‘posts’]
>>> post.insert(post)
ObjectId(‘4cb662f508bf532b1b000000’)
55. Inserindo mais de um documento de uma só vez...
>>> other_posts = [{‘title’:‘Segundo
post’,‘author’:‘Christiano Anderson’,‘tags’:
[‘teste’],‘content’:‘Esse eh meu segundo post’},
ObjectId(‘4cb6651b08bf532b970000000’)]
{‘title’:‘Terceiro post’,‘author’:‘Luke Skywalker’,‘tags’:
[‘naboo’,‘tatooine’],‘content’:‘Olah Princesa Leya’}
ObjectId(‘4cb6651b08bf532b970000001’)]
56. Pesquisando na base de dados com Python
>>> all_posts = db.post.find({})
>>> for p in all_posts:
... print p[‘title’]
Meu primeiro post
Meu segundo post
Olah Princesa Leya!
57. Outras consultas
>>> p = db.posts.find_one({‘tags’:‘naboo’})
>>> p = db.users.find({‘age’:{‘$gte’:18}})
58. Outras consultas
>>> p = db.posts.find_one({‘tags’:‘naboo’})
>>> p = db.users.find({‘age’:{‘$gte’:18}})
59. Outras consultas
>>> p = db.posts.find_one({‘tags’:‘naboo’})
>>> p = db.users.find({‘age’:{‘$gte’:18}})
É possível usar operadores como $lt,
$lte, $gt, $gte e outros
60. MongoEngine
- ORM para MongoDB
- Sintaxe bem similhar ao ORM do Django
- Baixa curva de aprendizado
- Bastante estável e eficiente
61. MongoEngine
- ORM para MongoDB
- Sintaxe bem similhar ao ORM do Django
- Baixa curva de aprendizado
- Bastante estável e eficiente
$ easy_install mongoengine
62. MongoEngine
- ORM para MongoDB
- Sintaxe bem similhar ao ORM do Django
- Baixa curva de aprendizado
- Bastante estável e eficiente
$ easy_install mongoengine
63. MongoEngine
- ORM para MongoDB
- Sintaxe bem similhar ao ORM do Django
- Baixa curva de aprendizado
- Bastante estável e eficiente
$ easy_install mongoengine
http://www.mongoengine.org
64. Exemplo MongoEngine
from mongoengine import *
class Usuario(Document):
nome = StringField(required=True)
email = StringField()
65. Exemplo MongoEngine
from mongoengine import *
class Usuario(Document):
nome = StringField(required=True)
email = StringField()
u = Usuario()
u.nome = “Christiano”
u.email = “anderson@gonow.com.br”
u.save()
66. Exemplo MongoEngine
from mongoengine import *
class Usuario(Document):
nome = StringField(required=True)
email = StringField()
u = Usuario()
u.nome = “Christiano”
u.email = “anderson@gonow.com.br”
u.save()
67. Exemplo MongoEngine
from mongoengine import *
class Usuario(Document):
nome = StringField(required=True)
email = StringField()
u = Usuario()
u.nome = “Christiano”
u.email = “anderson@gonow.com.br”
u.save() Salvou no banco