Introdução ao MongoDB
Christiano Andersonhttp://christiano.meTwitter: @dumpE-mail: [email protected]
Conceitos básicos
● Uma base de dados é composta de várias “coleções”;
● Uma coleção é composta de vários “documentos”
● Um documento é composto de vários “campos”
Definições
Banco Relacional MongoDB
Base de dados --> Base de Dados
Tabela --> Coleção
Registro --> Documento
Índice --> Índice
Join --> Documento embarcado
Foreign key --> Referência
Instalação
● A forma mais fácil é usar o gerenciador de pacotes da sua própria distribuição.
http://bit.ly/mongo_no_debian
MongoDB Shell
$ mongo
MongoDB Shell
● Roda engine JavaScript;● Permite manipular todo o banco de dados;● Permite criar funções;● Ler arquivos externos;● Realizar comandos administrativos;
Mongo Shell
anderson@endor:~$ mongoMongoDB shell version: 2.4.6connecting to: test> a = 1010> b = 3030> a < btrue> b < afalse
Consultando bases disponíveis
anderson@endor:~$ mongoMongoDB shell version: 2.4.6connecting to: test> show dbsbusca 0.203125GBdieese 5.951171875GBeasytaxi 0.453125GBlocal 0.078125GBmobile 0.203125GB>
Tudo é dinâmico
● Diferente de bancos relacionais, não há necessidade de criar modelagem antes;
● Ao definir algum valor, os dados são automaticamente criados;
● Tipagem forte;
Criando uma base de dadosanderson@endor:~$ mongoMongoDB shell version: 2.4.6connecting to: test> use uenfswitched to db uenf>
A base já foi criada
Inserindo registros
> db.alunos.insert({... nome: 'Christiano',... sobrenome: 'Anderson',... sexo: 'masculino',... idade: 33,... materias: ['MongoDB','Python','Lógica de Programação']... })>
A coleção “alunos” foi automaticamente criada
String entre aspas
Inteiro ou float sem aspas
Lista de valores
Listando as coleções
> show collectionsalunossystem.indexes>
Consultando todos os registros da coleção
> db.alunos.find({}){ "_id" : ObjectId("522f22b08434c181910716eb"), "nome" : "Christiano", "sobrenome" : "Anderson", "sexo" : "masculino", "idade" : 33, "materias" : [ "MongoDB", "Python", "Lógica de Programação" ] }>
Pretty
> db.alunos.find({}).pretty(){ "_id" : ObjectId("522f22b08434c181910716eb"), "nome" : "Christiano", "sobrenome" : "Anderson", "sexo" : "masculino", "idade" : 33, "materias" : [ "MongoDB", "Python", "Lógica de Programação" ]}>
Inserindo mais um documento> db.alunos.insert({... nome: 'Carolina',... sobrenome: 'Ferreira',... sexo: 'feminino',... idade: 29,... email: '[email protected]',... materias: ['MongoDB','Riak','Java'],... notas: {'MongoDB': 10, 'Riak': 8, 'Java': 9}... })>
Esse campo não tinha noRegistro anterior
Documento dentro dedocumento
Listando apenas o documento da Carolina
> db.alunos.find({'nome':'Carolina'}).pretty(){ "_id" : ObjectId("522f25248434c181910716ec"), "nome" : "Carolina", "sobrenome" : "Ferreira", "sexo" : "feminino", "idade" : 29, "email" : "[email protected]", "materias" : [ "MongoDB", "Riak", "Java" ], "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 }}>
Inserindo mais um documento
> db.alunos.insert({... nome: 'Juliana',... sobrenome: 'Silva',... sexo: 'feminino',... idade: 21,... materias: ['Riak','Python']... })
Contando documentos
> db.alunos.count()3
Contando apenas sexo feminino
> db.alunos.count({sexo:'feminino'})2>
Listando apenas quem é do sexo feminino
> db.alunos.find({sexo:'feminino'})
{ "_id" : ObjectId("5230ee7ec3141857756a81a8"), "nome" : "Carolina", "sobrenome" : "Ferreira", "sexo" : "feminino", "idade" : 29, "email" : "[email protected]", "materias" : [ "MongoDB", "Riak", "Java" ], "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 } }{ "_id" : ObjectId("5230eec6c3141857756a81a9"), "nome" : "Juliana", "sobrenome" : "Silva", "sexo" : "feminino", "idade" : 21, "materias" : [ "Riak", "Python" ] }
Listando quem tem MongoDB na matéria
> db.alunos.find({materias:'MongoDB'}){ "_id" : ObjectId("522f22b08434c181910716eb"), "nome" : "Christiano", "sobrenome" : "Anderson", "sexo" : "masculino", "idade" : 33, "materias" : [ "MongoDB", "Python", "Lógica de Programação" ] }{ "_id" : ObjectId("522f25248434c181910716ec"), "nome" : "Carolina", "sobrenome" : "Ferreira", "sexo" : "feminino", "idade" : 29, "email" : "[email protected]", "materias" : [ "MongoDB", "Riak", "Java" ], "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 } }>
Listando quem tem menos de 30 anos
> db.alunos.find({idade: {$lt: 30} })
{ "_id" : ObjectId("522f25248434c181910716ec"), "nome" : "Carolina", "sobrenome" : "Ferreira", "sexo" : "feminino", "idade" : 29, "email" : "[email protected]", "materias" : [ "MongoDB", "Riak", "Java" ], "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 } }{ "_id" : ObjectId("522f264c8434c181910716ed"), "nome" : "Juliana", "sobrenome" : "Silva", "sexo" : "feminino", "idade" : 21, "materias" : [ "Riak", "Python" ] }>
Alguns operadores de consulta
Operador Descrição
$gt Maior que
$gte Maior ou igual que
$lt Menor que
$lte Menor ou igual que
Updates
A Carolina casou e precisa mudar seu sobrenome, como fazer?
Atualização campo já existente em documento
> db.alunos.update({'nome':'Carolina'}, {$set: {'sobrenome':'Ferreira Martins'}})
Vamos ver como ficou...> db.alunos.find({'nome':'Carolina'}).pretty(){ "_id" : ObjectId("522f2b998434c181910716ee"), "email" : "[email protected]", "idade" : 29, "materias" : [ "MongoDB", "Riak", "Java" ], "nome" : "Carolina", "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 }, "sexo" : "feminino", "sobrenome" : "Ferreira Martins"}>
O que acontece se fizer isso?
> db.alunos.update({'nome':'Carolina'}, {'sobrenome':'Ferreira Martins'})
Removendo registros
db.alunos.remove({'sobrenome':'Ferreira Martins'})
Adicionando a Carolina novamente
http://pastebin.com/x38NFgu1
Listando apenas o primeiro nome de todo mundo na coleção
> db.alunos.find( {}, {'nome':true} )
{ "_id" : ObjectId("522f22b08434c181910716eb"), "nome" : "Christiano" }{ "_id" : ObjectId("522f264c8434c181910716ed"), "nome" : "Juliana" }{ "_id" : ObjectId("522f2b998434c181910716ee"), "nome" : "Carolina" }>
O MongoDB sempre vai mostrar o ObjectID, mas tem como tira-lo do resultado, veja...
Sem o ObjectID
> db.alunos.find({},{'nome':true, '_id': false})
{ "nome" : "Christiano" }{ "nome" : "Juliana" }{ "nome" : "Carolina" }
Ordenação – A até Z
> db.alunos.find({}, {'nome': true, '_id': false}).sort({nome: 1})
{ "nome" : "Carolina" }{ "nome" : "Christiano" }{ "nome" : "Juliana" }
Ordenação inversa – Z até A
> db.alunos.find({}, {'nome': true, '_id': false}).sort({nome: -1})
{ "nome" : "Christiano" }{ "nome" : "Carolina" }
>
{ "nome" : "Juliana" }
Ordenando mais novo ao mais velho
> db.alunos.find({}, {'nome': true, idade: true, '_id': false}).sort({idade: 1})
{ "nome" : "Juliana", "idade" : 21 }{ "idade" : 29, "nome" : "Carolina" }{ "nome" : "Christiano", "idade" : 33 }>
Como descobrir quem não tem o campo email no documento?
> db.alunos.find({'email': {$exists: false} })
Adicionando um campo em todos os documentos
Como adicionar um campo tipo bool (True, False) em todos os registros?
Veja bem....
> db.alunos.update({ },
{ $set: { 'aprovado': true } },
{ multi: true })
O que adicionar
Query
Grava a alteração em todosOs registros que atendem
Ao critério
Trabalhando com documentos embarcados (Join)
> db.materias.insert( { 'titulo':'MongoDB','alunos': [ ] } )
Referenciando ao ObjectID da Carolina
> db.materias.update( { 'titulo':'MongoDB' },{ $addToSet: { 'alunos':ObjectId("522f2b998434c181910716ee") } } )
Referenciando ao ObjectID do Christiano
> db.materias.update({'titulo':'MongoDB'},{$addToSet:{'alunos':ObjectId("522f22b08434c181910716eb")}})
Resultado
> db.materias.find().pretty(){ "_id" : ObjectId("522f52b3fc53342aee8297f6"), "alunos" : [ ObjectId("522f2b998434c181910716ee"), ObjectId("522f22b08434c181910716eb") ], "titulo" : "MongoDB"}
Parte II
Python e MongoDB
Instalando Virtualenv
aptitude install python-virtualenv
Habilitando virtualenv
virtualenv pymongo
Iniciando virtualenv
source pymongo/bin/activate
(pymongo)anderson@endor:~$
Instalando o PyMongo via PIP
pip install pymongo
Testando a conexão
(pymongo)anderson@endor:~$ pythonPython 2.7.3 (default, Jan 2 2013, 13:56:14) [GCC 4.7.2] on linux2Type "help", "copyright", "credits" or "license" for more information.>>>
Listando os nomes dos alunos
(pymongo)anderson@endor:~$ pythonPython 2.7.3 (default, Jan 2 2013, 13:56:14) [GCC 4.7.2] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> from pymongo import MongoClient>>> client = MongoClient()>>> db = client.fef>>> col_alunos = db.alunos>>> todos_alunos = col_alunos.find({})>>> for aluno in todos_alunos:... print aluno['nome']... ChristianoCarolinaCarlos>>>