Minicurso Introdução ao mongoDB SCTI

Post on 09-Jul-2015

227 views 3 download

description

Por: Christiano Anderson

Transcript of Minicurso Introdução ao mongoDB SCTI

Introdução ao MongoDB

Christiano Andersonhttp://christiano.meTwitter: @dumpE-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:~$ 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: 'carol@yahoo.com',... 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" : "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" : "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>>>

christiano@christiano.me