Workshop MongoDB

Click here to load reader

download Workshop MongoDB

of 60

  • date post

    12-Apr-2017
  • Category

    Technology

  • view

    247
  • download

    6

Embed Size (px)

Transcript of Workshop MongoDB

Armazenamento e consultas em grande volume de dados com flexibilidade e performance.

Boa tarde!

Objetivo: Uma viso geral sobre funcionalidades, particularidades e performance.

Leonardo Loures QuirinoDesenvolvedor Java na Bematech desde 2014.

leonardo.quirino@bematech.com.br

twitter: @LeonrdQrn

Desenvolvedor Java, trabalho na bematech h um ano, entrei exatamente em Dezembro e venho trabalhando no projeto Marbella Fiscal Cloud.Aprendendo MongoDB desde ento. Fiz 2 cursos online na Univesidade MongoDB.

Quem quiser pode procurar pelo meu nome no Linkedn.

TpicosIntroduo ao MongoDBManipulao de dadosPerformanceRplicasShardingFramework de AgregaoFrameworks Java

A apresentao vai passar pelos seguintes tpicos.

Introduo ao MongoDBBanco de dados no relacionalOrientado a documentosSchema flexvelOpen Source

Introduo ao MongoDBDocumentos word??? No!Documentos JSONEx: { a : 6,"b : teste,frutas: [ma, uva]}

Introduo ao MongoDBFlexibilidade:RequisitosSolues incrementaisMelhorias e evolues

Performance horizontalmente escalvelSem suporte a joinsSem suporte a transaes

Flexibilidade de solues e de projetos.Lidar com requisitos incompletos ou em constante mudana.Facilidade para comear pequeno e expandir.Facilidade de atualizaes e modificaes.

Objetivo utilizar vrios servidores em paralelo para escalar a performance.Schema flexvel permite dados pr agrupados dentro dos documentos (pr join)MongoDB lida com acessos atmicos a documentos minimizando a necessidade de transaes (document lock).

Performance x funcionalidade

Introduo ao MongoDBRelacionalMongoDatabaseDatabasetabelacoleesndicendicelinhadocumentocolunacampojoinagrupamento & ligaes

Analogias e correspondncias entre o mundo relacional e MongoDB

Introduo ao MongoDBExemplos de utilizaoticketmasterEASquareEnixGoogleCiscoebayfacebookFoursquare

Manipulao de dadosBSON - Binary JSONSuperset de JSONSaiba mais: http://bsonspec.org/

Na verdade MongoDB trabalha internamente com documentos BSON, uma serializao em formato binrio de documentos JSON.

BSON possui caractersticas que JSON no possui, como um tipo Data e um tipo Binrio.O tipo data por exemplo representado por um objeto javascript e apresentado dentro de um construtor chamado ISODate.

Manipulao de dadosCRUD:InsertFindRemoveUpdate

Operaes CRUD esto mapeadas dentro do MongoDB como funes nas APIs das linguagens de programao, no como uma linguagem separada.

Exemplos esto como se estivessem na shell do mongoDB, que um Interpretador javascript interativo, similar ao Bash Shell.

Inserindo um documento> doc = {nome : Leonardo Quirino,idade : 30, profisso : Desenvolvedor}

> db.pessoas.insert ( doc )

DB o banco no qual estamos trabalhando. possvel chamar a varivel db para que ela retorne o nome do banco atual.Collections so propriedades de uma base de dados, e devem ser acessados com a notao de ponto.

Procurando documentos> db.pessoas.findOne( ) ou db.pessoas.find( )

{_id : ObjectId("507f1f77bcf86cd799439011"), nome : Leonardo Quirino, idade : 30, profisso : Desenvolvedor}

A operao de busca anloga operao de insero.

Posso neste caso chamar a funo find() ou findOne().

A estrutura inserida atualmente exibe um campo que no foi inserido explicitamente.

Procurando documentosO campo _idAnlogo chave primria no modelo relacionalCampo obrigatrio Valor nico dentro da coleoValor imutvelPode ser um documentoEx:_id : { nome : Fulano, sobrenome : de tal }

MongoDB exige que todos os documentos possuam um campo _id.

Este campo deve ter valor nico dentro da coleo e seu valor imutvel.

Pode ser um documento, MAS TEM QUE SER UM VALOR NICO!

Se no for explicitamente criado, MongoDB ir inserir um campo com um valor do tipo interno ObjectId

Procurando documentosOs mtodos de busca aceitam parmetros para realizar as buscas.Primeiro argumento : FiltrosSegundo argumento : Modelo a ser retornado> db.pessoas.findOne( { nome : Leonardo Quirino } , { nome : true } )

{ _id : ObjectId("....") , nome : Leonardo Quirino }

> db.pessoas.findOne( { nome : Leonardo Quirino } , { nome : true , _id : false } )

{ nome : Leonardo Quirino }

Os params tanto de busca quanto de modelo so documentos estruturados no formato JSON que representam os filtros a serem executados pelo MongoDB

O campo _id por padro retornado pelo servidor mesmo que voc nao pea por ele, a no ser que ele serja excludo explicitamente da estrutura de retorno.

Procurando documentosOperadores$gt e $lt / $gte e $lte Ex: > db.notas.find({nota : {$gt : 60 }})

$existsEx: > db.pessoas.find({profisso : {$exists : true }})

$typeEx: > db.pessoas.find({nome : {$type : 2 }})

https://docs.mongodb.org/manual/reference/bson-types/

$regexEx: > db.pessoas.find({nome : {$regex : o$ }})

MongoDB aceita diversos operadores como argumentos para criar queries mais complexas.

gt e lt tambm podem ser usados em strings para comparaes lexicogrficas.

Type compara o tipo do campo de acordo com os tipos BSON. Para ver os tipos possveis, segue a URL

Regex no so eficientes em Mongo. Limitar o uso a comparaes de comea com.

Operadores$orEx: > db.pessoas.find ({ $or : [{ nome" : Leonardo Quirino },{ profisso : Desenvolvedor }] } )

$andEx: > db.pessoas.find ({ $and : [{ nome" : Leonardo Quirino },{ profisso : Desenvolvedor }] } )Procurando documentos

operadores prefixados, vem antes dos argumentos e recebe um array com os argumentos a serem testados.

$and similar a OR, mas pouco usado pois na maioria das situaes pode ser substituido encadeando campos no mesmo documento.

> db.notas.find ( {nota : { $gt : 50 },nota : { $lt : 60 }} );

[ ] Encontra todos os documentos com nota entre 50 e 60[ ] Encontra todos os documentos com nota maior que 50[ ] Encontra todos os documentos com nota menor que 60[ ] Nenhuma das opesPerguntaX

MongoDB ao montar a estrutura do documento passado como filtro, substituiu o campo se ele se repetir.

Queries em arraysSe quisermos buscar valores dentro de arrays?

{_id : ObjectId("507f1f77bcf86cd799439011"), nome : Leonardo Quirino, idade : 30, skills : [ Java, MongoDB]}

> db.pessoas.find ({ skills : MongoDB })

Ns vimos que os documentos podem ter estruturas diversas, e vimos que possvel armazenar arrays campo.E como fazemos para buscar valores dentro dos arrays?

Queries em MongoDB so polimrficas!skills pode ser uma string com valor MongoDB, ou um array que contenha um string MongoDB.No confundir com recurso, mongodb percorre somente o nvel especificado explicitamente.

E se o array na verdade tivesse documentos? E se quisessemos um array que contenha um elemento que satisfaa todas as condies?

Queries em arrays$elemMatch

{ _id: 1, resultados: [ 82, 85, 88 ] }{ _id: 2, resultados: [ 75, 88, 89 ] }

> db.resultados.find ({ results : { $elemMatch: { $gte: 80, $lt: 85 } } }){ "_id" : 1, "results" : [ 82, 85, 88 ] }Operaes de conjunto

$all> db.pessoas.find ( { skills : { $all : [java, mongodb] } )

$in> db.pessoas.find ( { skills : { $in : [java, mongodb] } )

Por padro, mongoDb trata o array como um campo.Para realizar uma query em que um elemento de array satisfaa todas as condies desejadas, necessrio usar $elemMatchOu seja, se um array tiver vrios elementos, cuja combinao satisfaa as condies (mesmo que separadamente) da query, ento o documento que tem este array ser retonado.

Documentos aninhadosEx: > db.usuarios.find({ email : { pessoal : ful@no.com.br, trabalho : fulano@bematotvs.com.br }})

Notao de ponto

> db.usuarios.find ({email.trabalho : fulano@bematotvs.com.br})

Ao passar um documento estruturado como parmetro, MongoDB ir buscar a mesma estrutura exata nos documentos.Nesse caso, no haver match pois a ordem dos campos est errada.Mesmo que o campo dentro de EMAIL fosse somente TRABALHO, no haveria match, pois a estrutura ainda assim seria diferente.

Documentos aninhadosEx: {product : "Super phone",price : 100.000,reviews : [{ user : "fred", comment : "Great!" , rating : 5 },{ user : "tom" , comment : "I agree with Fred, somewhat!" , rating : 4 }]}

Encontrar produtos que custem mais de 10.000 e possuem rating 5 ou mais.

> db.catalogo.find ({pricing : { $gte : 10.000 },reviews.rating : { $gte : 5 }})

Objeto Cursor> cur = db.catalogo.find({pricing : { $gte : 10.000},reviews.rating: { $gte : 5}})

Ex:cur.hasNext();cur.next();cur.sort({princing : 1});

Ao realizar uma busca no MongoDB possvel mapear o resultado como um cursor, um objeto interno que permite a manipulao do acesso aos resultados.Aps mapeado, o cursor permite executar alguns mtodos em cima do resultado da query.

Contando documentoscount( )Estrutura similar ao find( ).

Ex: > db.catalogo.count({pricing : { $gte : 10.000},reviews.rating: { $gte : 5}})

Estruturado de forma similar ao find, contando o nmero de docs que satisfaz as condies passadas.

Atualizando documentosSe eu quisesse adicionar um endereo no meu cadastro?> db.pessoas.update({nome : Leonardo Quirino},{nome : Leonardo Loures Quirino, Endereo : Jacarepagu})

Problema?

O documento passado como segundo argumento substitui o documento original como um todo!

Vemos que daqui para a frente as estruturas sero bem similares, pois j vimos o bsico da montagem das queries em MongoDB.

O mtodo de update recebe como primeiro argumento o filtro, e segundo o doc a ser atualizado.

Mas MongoDB ira inserir o doc passado como um todo