1
Desenvolvendo soluções com banco de dadosnão relacional - MongoDB
Christiano AndersonTwitter: @dumpBlog: http://christiano.meEmail: [email protected]: http://www.gonow.com.br
1
2
• Banco de dados não relacional;
• Orientado a documentos;
• Alta Performance;
• Software Livre;
• Schema Free;
O que é MongoDB?
3
“MongoDB preenche a lacuna entre modelagem chave/ valor (que são bem rápidas e escaláveis)
e os tradicionais banco de dados relacionais (que oferecem várias funcionalidades)”
4
• Foursquare;
• Github;
• SourceForge;
• Disqus;
• bit.ly;
• Globo.com;
• Entre outros...
Quem utiliza?
5
Não muito bom se você precisa de...
Transações
Suporte completo a SQL
6
Linguagens de Programação
• O MongoDB tem suporte nativo para as principais linguagens de programação:
• C, C++, Erlang, Haskell, Java, JavaScript, Perl, PHP, Python, .NET, Ruby, Scala, Go Language, Node.js, Lisp, Lua, Smalltalk...
• Relação completa em: http://www.mongodb.org/display/DOCS/Drivers
7
Modelo de documento
{‘nome’:‘Christiano’,‘linguagem’:‘Python’,‘nota’: 10}
Sim, é praticamente um JSON.Muito fácil trabalhar com esse modelode dados na maioria das linguagens de
programação.
8
Migrations
É possível mudar dinamicamente um documento
{‘nome’:‘Christiano’,‘linguagem’: ‘Python’,‘nota’: 10}
{‘nome’:‘Christiano’,‘linguagem’: ‘Python’,‘nota’: 10,‘local’: ‘Gonow’}
Não é necessário alterar a modelagem parainserir novos elementos...
9
Map/Reduce
É utilizado para criar funções especiais, pode sercomparado a uma stored procedure
Utiliza-se JavaScript para criar essas funções
Bastante flexível
10
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;}
Map/Reduce
11
SQL MongoDB
INSERT INTO USERS VALUES(1,1)
db.users.insert({a:1, b:1})
SELECT a,b FROM usersdb.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”})
Comparando SQL e MongoDB 1
12
SQL MongoDBSELECT * FROM users
WHERE age=33 ORDER BY name
db.users.find({‘age’:33}).sort({name:1})
SELECT * FROM users WHERE age < 33
db.users.find({‘age’:{$lt:33}})})
CREATE INDEX myindexname ON
user(name)
db.users.ensureIndex({name:1})
SELECT * FROM users WHERE a = 1 AND b = ‘q’ db.users.find({a:1, b:’q’})
SELECT * FROM users LIMIT 10 SKIP 20db.users.find().limit(10).skip(
20)
Comparando SQL e MongoDB 2
13
• É possível armazenar arquivos binários no MongoDB;
• Maior flexibilidade para tratar arquivos utilizando sua linguagem de programação favorita;
• Maior controle de permissão de acesso;
• Possível armazenar arquivos grandes no MongoDB;
• Mais: http://www.mongodb.org/display/DOCS/GridFS
GridFS
14
• Possível dividir a carga em vários servidores, replicando seu conteúdo via Replica Sets;
• Possível crescer o ambiente de forma bastante orgânica;
• Replica Set consiste em um ou mais node que replicam seus valores entre si.
Replica sets
Server Server 11
Server Server 22
PrimáriPrimárioo ClienteCliente
Leitura, Escrita
Somente leitura
15
Python e MongoDB
>>> from pymongo import Connection>>> con = Connection(“localhost”)>>> db = con[‘blog’]
Exemplo de conexão
16
>>> post = {'title':'My first post', …'author': 'Christiano Anderson', …'content': 'This is my first paragraph', … 'tags': ['mongodb','blog','example']}>>> posts = db['posts'] >>> posts.insert(post) ObjectId('4cb662f508bf532b1b000000')
Inserindo um documento
17
>>> other_posts = [{'title':'Second Post', 'author': 'Christiano Anderson','tags':['test'], 'content': 'Hey, my second Post'}, {'title':'Third Post', 'author':'Luke Skywalker','tags':['naboo'],'content':'Hey princess Leya'}] >>> posts.insert(other_posts) [ObjectId('4cb6651b08bf532b97000000'), ObjectId('4cb6651b08bf532b97000001')]
Inserindo vários documentos
18
>>> my_post = db.posts.find_one({}) {u'content': u'This is my first post at MongoDB', u'title': u'My first post', u'_id': ObjectId('4cb662f508bf532b1b000000'), u'tags': [u'mongodb', u'blog', u'example'], u'author': u'Christiano Anderson'} >>> my_post = db.posts.find_one({ 'author': 'Christiano Anderson'})
Realizando pesquisas
19
• Também é possível utilizar operadores como $ne, $lte, $gte,entre outros...
• Mais: http://www.mongodb.org/display/DOCS/Advanced+Queries
Operadores
20
>>> all_posts = db.posts.find({}) >>> for p in all_posts: ... print p['title'] My first post Second Post Third Post
Consultando a base
21
>>> p = db.posts.find_one({'tags':'naboo'}) {u'content': u'Hey princess Leya', u'title': u'Third Post', u'_id': ObjectId('4cb6651b08bf532b97000001'), u'tags': [u'naboo'], u'author': u'Luke Skywalker'}
Consultando a base - passando parâmetros
22
• MongoGrid é um serviço oferecido pela NodeGrid, criada por brasileiros:
• http://nodegrid.com/resources/mongogrid/
Hospedando MongoDB na nuvem
23
Obrigado!!!
Christiano AndersonTwitter: @dumpBlog: http://christiano.meEmail: [email protected]: http://www.gonow.com.br
Top Related