1. Django e MongoDB
Christiano Anderson
Twitter: @dump
Blog: http://christiano.me
Email: anderson@gonow.com.br
Site: http://www.gonow.com.br
2. • Trabalha com web desde 1995;
• Gerente de Projetos da Gonow;
• Ex-desenvolvedor do Projeto GNU (FSF);
• Trabalha com Python desde 2000;
• Membro da equipe de tradução do
MongoDB para pt_BR;
• Evangelista Python, Django e NoSQL;
5. O que é MongoDB?
Banco de dados não relacional
Orientado a documentos
6. O que é MongoDB?
Banco de dados não relacional
Alta performance
Orientado a documentos
7. O que é MongoDB?
Banco de dados não relacional
Software Livre
Alta performance
Orientado a documentos
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, é praticamente um JSON.
É muito fácil trabalhar com esse modelo de dados em
qualquer linguagem de programação
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!
34. Map/Reduce
É utilizado para criar funções especiais, pode ser
comparado a uma stored procedure
35. Map/Reduce
É utilizado para criar funções especiais, pode ser
comparado a uma stored procedure
Utiliza-se JavaScript para criar essas funções
36. 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
37. 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;
}
38. 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”})
39. 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)
43. Outros recursos bacanas
Suporte a índices;
GridFS;
Replicação de dados;
Alta disponibilidade;
44. Outros recursos bacanas
Suporte a índices;
GridFS;
Replicação de dados;
Alta disponibilidade;
É software livre, mas também oferece suporte
comercial!
47. Como Instalar?
Considerando o Django e Pymongo já instalados:
$ hg clone http://bitbucket.org/wkornewald/django-nonrel
$ cd django-nonrel && python setup.py install
48. Como Instalar?
Considerando o Django e Pymongo já instalados:
$ hg clone http://bitbucket.org/wkornewald/django-nonrel
$ cd django-nonrel && python setup.py install
$ hg clone http://bitbucket.org/wkornewald/djangotoolbox
$ cd djangotoolbox && python setup.py install
49. Como Instalar?
Considerando o Django e Pymongo já instalados:
$ hg clone http://bitbucket.org/wkornewald/django-nonrel
$ cd django-nonrel && python setup.py install
$ hg clone http://bitbucket.org/wkornewald/djangotoolbox
$ cd djangotoolbox && python setup.py install
$ git clone https://github.com/django-mongodb-engine/mongodb-
engine
$ cd mongodb-engine && python setup.py install
51. Rodando Syncdb
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installing indices for auth.Permission model
Installing indices for auth.Group_permissions model
Installing indices for auth.Group model
Installing indices for auth.User_user_permissions model
Installing indices for auth.User_groups model
Installing indices for auth.User model
Installing indices for auth.Message model
Installing indices for contenttypes.ContentType model
Installing indices for sessions.Session model
Installing indices for sites.Site model
Installing indices for admin.LogEntry model
Installing indices for inicio.Usuario model
No fixtures found.
53. Correção SITE_ID
MongoDB shell version: 2.0.0
connecting to: test
> show dbs
local
(empty)
testedjango
0.203125GB
> use testedjango
switched to db testedjango
> show collections
auth_group
auth_group_permissions
auth_message
auth_permission
auth_user
auth_user_groups
auth_user_user_permissions
django_admin_log
django_content_type
django_session
django_site
inicio_usuario
system.indexes
54. Correção SITE_ID
MongoDB shell version: 2.0.0
connecting to: test
> show dbs
local
(empty)
testedjango
0.203125GB
> use testedjango
switched to db testedjango
> show collections
auth_group
auth_group_permissions
auth_message
auth_permission
auth_user
auth_user_groups
auth_user_user_permissions
django_admin_log
django_content_type
django_session
django_site
inicio_usuario
system.indexes
55. Correção SITE_ID
MongoDB shell version: 2.0.0
connecting to: test
> show dbs
local
(empty)
testedjango
0.203125GB
> use testedjango
switched to db testedjango
> show collections
auth_group
auth_group_permissions
auth_message
auth_permission
auth_user
> db.django_site.find({})
auth_user_groups
{ "_id" : ObjectId("4e85e53295f9eb0d9d00001d"),
auth_user_user_permissions
"domain" : "example.com", "name" : "example.com" }
django_admin_log
>
django_content_type
django_session
django_site
inicio_usuario
system.indexes
56. Correção SITE_ID
MongoDB shell version: 2.0.0
connecting to: test
> show dbs
local
(empty)
testedjango
0.203125GB
> use testedjango
switched to db testedjango
> show collections
auth_group
auth_group_permissions
auth_message
auth_permission
auth_user
> db.django_site.find({})
auth_user_groups
{ "_id" : ObjectId("4e85e53295f9eb0d9d00001d"),
auth_user_user_permissions
"domain" : "example.com", "name" : "example.com" }
django_admin_log
>
django_content_type
django_session
django_site
inicio_usuario
system.indexes
57. Correção SITE_ID
MongoDB shell version: 2.0.0
connecting to: test
> show dbs
local
(empty)
testedjango
0.203125GB
> use testedjango
switched to db testedjango
> show collections
auth_group
auth_group_permissions Seu novo SITE_ID
auth_message
auth_permission
auth_user
> db.django_site.find({})
auth_user_groups
{ "_id" : ObjectId("4e85e53295f9eb0d9d00001d"),
auth_user_user_permissions
"domain" : "example.com", "name" : "example.com" }
django_admin_log
>
django_content_type
django_session
django_site
inicio_usuario
system.indexes
63. Django MongoDB Engine
• Possível trabalhar da mesma forma, como
em um banco relacional;
• Many to many funciona normalmente;
• Admin funciona;
• Sessões e autenticação também funcionam;
64. Outras funcionalidades
- O módulo também implementa:
- GridFS;
- Map/Reduce;
- Cache;
- Agregadores;
- Operações mais baixo nível