Desenvolvendo soluções com banco de dados não relacional - MongoDB

23
1 Desenvolvendo soluções com banco de dados não relacional - MongoDB Christiano Anderson Twitter: @dump Blog: http://christiano.me Email: [email protected]r Site: http://www.go now.com.br 1

description

Palestra de Christiano Anderson no tech talk 7Masters no iMasters.

Transcript of Desenvolvendo soluções com banco de dados não relacional - MongoDB

Page 1: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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

Page 2: Desenvolvendo soluções com banco de dados não relacional - MongoDB

2

• Banco de dados não relacional;

• Orientado a documentos;

• Alta Performance;

• Software Livre;

• Schema Free;

O que é MongoDB?

Page 3: Desenvolvendo soluções com banco de dados não relacional - 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)”

Page 4: Desenvolvendo soluções com banco de dados não relacional - MongoDB

4

• Foursquare;

• Github;

• SourceForge;

• Disqus;

• bit.ly;

• Globo.com;

• Entre outros...

Quem utiliza?

Page 5: Desenvolvendo soluções com banco de dados não relacional - MongoDB

5

Não muito bom se você precisa de...

Transações

Suporte completo a SQL

Page 6: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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

Page 7: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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.

Page 8: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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...

Page 9: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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

Page 10: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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

Page 11: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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

Page 12: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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

Page 13: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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

Page 14: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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

Page 15: Desenvolvendo soluções com banco de dados não relacional - MongoDB

15

Python e MongoDB

>>> from pymongo import Connection>>> con = Connection(“localhost”)>>> db = con[‘blog’]

Exemplo de conexão

Page 16: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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

Page 17: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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

Page 18: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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

Page 19: Desenvolvendo soluções com banco de dados não relacional - MongoDB

19

• Também é possível utilizar operadores como $ne, $lte, $gte,entre outros...

• Mais: http://www.mongodb.org/display/DOCS/Advanced+Queries

Operadores

Page 20: Desenvolvendo soluções com banco de dados não relacional - MongoDB

20

>>> all_posts = db.posts.find({}) >>> for p in all_posts: ... print p['title'] My first post Second Post Third Post

Consultando a base

Page 21: Desenvolvendo soluções com banco de dados não relacional - MongoDB

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

Page 22: Desenvolvendo soluções com banco de dados não relacional - MongoDB

22

• MongoGrid é um serviço oferecido pela NodeGrid, criada por brasileiros:

• http://nodegrid.com/resources/mongogrid/

Hospedando MongoDB na nuvem

Page 23: Desenvolvendo soluções com banco de dados não relacional - MongoDB

23

Obrigado!!!

Christiano AndersonTwitter: @dumpBlog: http://christiano.meEmail: [email protected]: http://www.gonow.com.br