Introdução ao MongoDB 
Christiano Anderson 
http://christiano.me 
Twitter: @dump 
E-mail: chris@christiano.me
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:~$ mongo 
MongoDB shell version: 2.4.6 
connecting to: test 
> a = 10 
10 
> b = 30 
30 
> a < b 
true 
> b < a 
false
Consultando bases disponíveis 
anderson@endor:~$ mongo 
MongoDB shell version: 2.4.6 
connecting to: test 
> show dbs 
busca 0.203125GB 
dieese 5.951171875GB 
easytaxi 0.453125GB 
local 0.078125GB 
mobile 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 dados 
anderson@endor:~$ mongo 
MongoDB shell version: 2.4.6 
connecting to: test 
> use uenf 
switched to db uenf 
> 
A base já foi criada
Inserindo registros 
A coleção “alunos” foi automaticamente criada 
> db.alunos.insert({ 
... nome: 'Christiano', 
String entre aspas 
... sobrenome: 'Anderson', 
... sexo: 'masculino', 
... idade: 33, 
Inteiro ou float sem aspas 
... materias: ['MongoDB','Python','Lógica de Programação'] 
... }) 
> 
Lista de valores
Listando as coleções 
> show collections 
alunos 
system.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: 'carol@yahoo.com', 
... materias: ['MongoDB','Riak','Java'], 
... notas: {'MongoDB': 10, 'Riak': 8, 'Java': 9} 
... }) 
> 
Esse campo não tinha no 
Registro anterior 
Documento dentro de 
documento
Listando apenas o documento da 
Carolina 
> db.alunos.find({'nome':'Carolina'}).pretty() 
{ 
"_id" : ObjectId("522f25248434c181910716ec"), 
"nome" : "Carolina", 
"sobrenome" : "Ferreira", 
"sexo" : "feminino", 
"idade" : 29, 
"email" : "carol@yahoo.com", 
"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" : "carol@yahoo.com", "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" : "carol@yahoo.com", "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" : "carol@yahoo.com", "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" : "carol@yahoo.com", 
"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" : "Juliana" } 
{ "nome" : "Christiano" } 
{ "nome" : "Carolina" } 
>
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.... 
Query 
> db.alunos.update({ }, 
{ $set: { 'aprovado': true } }, 
{ multi: true }) 
O que adicionar 
Grava a alteração em todos 
Os 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:~$ python 
Python 2.7.3 (default, Jan 2 2013, 13:56:14) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more 
information. 
>>>
Listando os nomes dos alunos 
(pymongo)anderson@endor:~$ python 
Python 2.7.3 (default, Jan 2 2013, 13:56:14) 
[GCC 4.7.2] on linux2 
Type "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'] 
... 
Christiano 
Carolina 
Carlos 
>>>
christiano@christiano.me

Minicurso Introdução ao mongoDB SCTI

  • 1.
    Introdução ao MongoDB Christiano Anderson http://christiano.me Twitter: @dump E-mail: chris@christiano.me
  • 2.
    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”
  • 3.
    Definições Banco RelacionalMongoDB Base de dados --> Base de Dados Tabela --> Coleção Registro --> Documento Índice --> Índice Join --> Documento embarcado Foreign key --> Referência
  • 4.
    Instalação ● Aforma mais fácil é usar o gerenciador de pacotes da sua própria distribuição. http://bit.ly/mongo_no_debian
  • 5.
  • 6.
    MongoDB Shell ●Roda engine JavaScript; ● Permite manipular todo o banco de dados; ● Permite criar funções; ● Ler arquivos externos; ● Realizar comandos administrativos;
  • 7.
    Mongo Shell anderson@endor:~$mongo MongoDB shell version: 2.4.6 connecting to: test > a = 10 10 > b = 30 30 > a < b true > b < a false
  • 8.
    Consultando bases disponíveis anderson@endor:~$ mongo MongoDB shell version: 2.4.6 connecting to: test > show dbs busca 0.203125GB dieese 5.951171875GB easytaxi 0.453125GB local 0.078125GB mobile 0.203125GB >
  • 9.
    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;
  • 10.
    Criando uma basede dados anderson@endor:~$ mongo MongoDB shell version: 2.4.6 connecting to: test > use uenf switched to db uenf > A base já foi criada
  • 11.
    Inserindo registros Acoleção “alunos” foi automaticamente criada > db.alunos.insert({ ... nome: 'Christiano', String entre aspas ... sobrenome: 'Anderson', ... sexo: 'masculino', ... idade: 33, Inteiro ou float sem aspas ... materias: ['MongoDB','Python','Lógica de Programação'] ... }) > Lista de valores
  • 12.
    Listando as coleções > show collections alunos system.indexes >
  • 13.
    Consultando todos osregistros 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" ] } >
  • 14.
    Pretty > db.alunos.find({}).pretty() { "_id" : ObjectId("522f22b08434c181910716eb"), "nome" : "Christiano", "sobrenome" : "Anderson", "sexo" : "masculino", "idade" : 33, "materias" : [ "MongoDB", "Python", "Lógica de Programação" ] } >
  • 15.
    Inserindo mais umdocumento > db.alunos.insert({ ... nome: 'Carolina', ... sobrenome: 'Ferreira', ... sexo: 'feminino', ... idade: 29, ... email: 'carol@yahoo.com', ... materias: ['MongoDB','Riak','Java'], ... notas: {'MongoDB': 10, 'Riak': 8, 'Java': 9} ... }) > Esse campo não tinha no Registro anterior Documento dentro de documento
  • 16.
    Listando apenas odocumento da Carolina > db.alunos.find({'nome':'Carolina'}).pretty() { "_id" : ObjectId("522f25248434c181910716ec"), "nome" : "Carolina", "sobrenome" : "Ferreira", "sexo" : "feminino", "idade" : 29, "email" : "carol@yahoo.com", "materias" : [ "MongoDB", "Riak", "Java" ], "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 } } >
  • 17.
    Inserindo mais umdocumento > db.alunos.insert({ ... nome: 'Juliana', ... sobrenome: 'Silva', ... sexo: 'feminino', ... idade: 21, ... materias: ['Riak','Python'] ... })
  • 18.
    Contando documentos >db.alunos.count() 3
  • 19.
    Contando apenas sexofeminino > db.alunos.count({sexo:'feminino'}) 2 >
  • 20.
    Listando apenas quemé do sexo feminino > db.alunos.find({sexo:'feminino'}) { "_id" : ObjectId("5230ee7ec3141857756a81a8"), "nome" : "Carolina", "sobrenome" : "Ferreira", "sexo" : "feminino", "idade" : 29, "email" : "carol@yahoo.com", "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" ] }
  • 21.
    Listando quem temMongoDB 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" : "carol@yahoo.com", "materias" : [ "MongoDB", "Riak", "Java" ], "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 } } >
  • 22.
    Listando quem temmenos de 30 anos > db.alunos.find({idade: {$lt: 30} }) { "_id" : ObjectId("522f25248434c181910716ec"), "nome" : "Carolina", "sobrenome" : "Ferreira", "sexo" : "feminino", "idade" : 29, "email" : "carol@yahoo.com", "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" ] } >
  • 23.
    Alguns operadores deconsulta Operador Descrição $gt Maior que $gte Maior ou igual que $lt Menor que $lte Menor ou igual que
  • 24.
    Updates A Carolinacasou e precisa mudar seu sobrenome, como fazer?
  • 25.
    Atualização campo jáexistente em documento > db.alunos.update({'nome':'Carolina'}, {$set: {'sobrenome':'Ferreira Martins'}})
  • 26.
    Vamos ver comoficou... > db.alunos.find({'nome':'Carolina'}).pretty() { "_id" : ObjectId("522f2b998434c181910716ee"), "email" : "carol@yahoo.com", "idade" : 29, "materias" : [ "MongoDB", "Riak", "Java" ], "nome" : "Carolina", "notas" : { "MongoDB" : 10, "Riak" : 8, "Java" : 9 }, "sexo" : "feminino", "sobrenome" : "Ferreira Martins" } >
  • 27.
    O que acontecese fizer isso? > db.alunos.update({'nome':'Carolina'}, {'sobrenome':'Ferreira Martins'})
  • 28.
  • 29.
    Adicionando a Carolinanovamente http://pastebin.com/x38NFgu1
  • 30.
    Listando apenas oprimeiro 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...
  • 31.
    Sem o ObjectID > db.alunos.find({},{'nome':true, '_id': false}) { "nome" : "Christiano" } { "nome" : "Juliana" } { "nome" : "Carolina" }
  • 32.
    Ordenação – Aaté Z > db.alunos.find({}, {'nome': true, '_id': false}).sort({nome: 1}) { "nome" : "Carolina" } { "nome" : "Christiano" } { "nome" : "Juliana" }
  • 33.
    Ordenação inversa –Z até A > db.alunos.find({}, {'nome': true, '_id': false}).sort({nome: -1}) { "nome" : "Juliana" } { "nome" : "Christiano" } { "nome" : "Carolina" } >
  • 34.
    Ordenando mais novoao 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 } >
  • 35.
    Como descobrir quemnão tem o campo email no documento? > db.alunos.find({'email': {$exists: false} })
  • 36.
    Adicionando um campoem todos os documentos Como adicionar um campo tipo bool (True, False) em todos os registros?
  • 37.
    Veja bem.... Query > db.alunos.update({ }, { $set: { 'aprovado': true } }, { multi: true }) O que adicionar Grava a alteração em todos Os registros que atendem Ao critério
  • 38.
    Trabalhando com documentos embarcados (Join) > db.materias.insert( { 'titulo':'MongoDB','alunos': [ ] } )
  • 39.
    Referenciando ao ObjectIDda Carolina > db.materias.update( { 'titulo':'MongoDB' },{ $addToSet: { 'alunos':ObjectId("522f2b998434c181910716ee") } } )
  • 40.
    Referenciando ao ObjectIDdo Christiano > db.materias.update({'titulo':'MongoDB'},{$addToSet: {'alunos':ObjectId("522f22b08434c181910716eb")}})
  • 41.
    Resultado > db.materias.find().pretty() { "_id" : ObjectId("522f52b3fc53342aee8297f6"), "alunos" : [ ObjectId("522f2b998434c181910716ee"), ObjectId("522f22b08434c181910716eb") ], "titulo" : "MongoDB" }
  • 42.
    Parte II Pythone MongoDB
  • 43.
    Instalando Virtualenv aptitudeinstall python-virtualenv
  • 44.
  • 45.
    Iniciando virtualenv sourcepymongo/bin/activate (pymongo)anderson@endor:~$
  • 46.
    Instalando o PyMongovia PIP pip install pymongo
  • 47.
    Testando a conexão (pymongo)anderson@endor:~$ python Python 2.7.3 (default, Jan 2 2013, 13:56:14) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>
  • 48.
    Listando os nomesdos alunos (pymongo)anderson@endor:~$ python Python 2.7.3 (default, Jan 2 2013, 13:56:14) [GCC 4.7.2] on linux2 Type "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'] ... Christiano Carolina Carlos >>>
  • 49.