Iniciando e conhecendo
Edemilson Luiz Gonçalves
ede.goncalves88@gmail.com
https://www.facebook.com/edegoncalves
MONGODB
• C++
• JSON/BSON
• Replica
• Sharding
• GridFS
• Aggregation Framework
Terminologia: MYSQL e MONGODB
MYSQL
DATABASE
TABLE
ROWS
QUERY
INDEX
PARTITION
MONGODB
DATABASE
COLLECTION
DOCUMENT JSON
QUERY
INDEX
SHARD
BANCO DE DADOS E COLEÇÃO
Selecionando o banco de dados que iremos utilizar:
use bancodedados
Visualizando os nossos bancos de dados:show dbs
Executando comandos:db.colecao.comando()
ex:
db.produtos.drop() // Apaga a coleção
db.produtos.remove() // Limpa a coleção
COMANDO INSERT
Inserimos um documento novo no Banco de dados utilizando o comando insert
$ db.pessoas.insert({"nome": "eduardo", "idade": 15, "saldo": 45.50})
Podemos utilizar valores que estão em variáveis
$ var pessoa1 = {"nome": "eduardo", "idade": 15, "saldo": 45.50};
$ db.pessoas.insert(pessoa1);
COMANDO SAVE
Podemos recuperar um documento, fazer as modificações necessárias e salvá-lo
novamente.
$ var pessoa1 = db.pessoas.findOne();
$ pessoa1.idade = 16;
$ db.pessoas.save(pessoa1);
COMANDO CURSOR
Todas as buscas feitas através do find() irá retornar um cursor, vamos
repeti-lo para retirarmos os valores.
$ var cursor = db.pessoas.find();
A linguagem utilizada no mongodb é o javascript então vamos usar o comando
forEach()
$ cursor.forEach(function(pessoa){
printjson(data.nome)
})
O comando acima irá listar os nomes de todas as pessoas cadastradas em nossa
coleção.
COMANDO FIND
Para realizar consultas no MongoDB utilizamos duas funções:
find() // Retorna um array, mesmo sendo apenas 1 documento.
findOne() // Retorna um único documento.
A sintaxe para fazermos consultas é:
$ db.pessoas.find({clausulas}, {campos});
$ db.pessoas.findOne({clausulas}, {campos});
ex:
$ db.pessoas.findOne({"nome": "eduardo"}, {"idade": 1}) // Selecione apenas
o campo idade.
$ db.pessoas.findOne({"nome": "eduardo"}, {"idade": 0}) // Selecione o
documento sem o campo idade.
OPERADORES
$lt
$ db.pessoas.find({"idade": {$lt: 18}})
Retorna os documentos com valores menores que 18
$lte
$ db.pessoas.find({"idade": {$lte: 18}})
Retorna os documentos com valores menores ou igual a 18
$gt
$ db.pessoas.find({"idade": {$gt: 18}})
Retorna os documentos com valores maiores que 18
$gte
$ db.pessoas.find({"idade": {$gte: 18}})
Retorna os documentos com valores maiores ou igual a 18
OPERADORES
$or
$ db.pessoas.find({"idade": 15, $or: [{"nome": "pedro"}, {"nome":
"eduardo"}]})
Buscamos um documentos em que a idade seja igual a 15 e o nome seja pedro ou
eduardo
$nor
$ db.pessoas.find({$nor: [{"nome": "pedro"}, {"nome": "eduardo"}]})
Buscamos um documentos em que o nome NÃO seja pedro ou eduardo
$and
$ db.pessoas.find({$and: [{"nome": "zeca"}, {"idade": {$lt: 15}}]})
Buscamos um documento em que nome seja zeca E idade menor que 15
OPERADORES
Existem campos que contém um array e alguns operadores para utilizarmos
neles
$ne
$ db.pessoas.find({cursos: {$ne: "mysql"}})
Buscamos dentro do campo cursos que é um array as pessoas que NÃO fizeram o
curso de mysql
$in
$ db.pessoas.find({cursos: {$in: ["mysql", "mongodb"]}})
Buscamos as pessoas que fizeram o curso de mysql ou mongodb, lembrando que o
$in espera sempre um array, mesmo que seja um único valor.
$nin
$ db.pessoas.find({cursos: {$nin: ["mysql", "mongodb"]}})
Retorna as pessoas que não fizeram curso de mysql ou mongodb. Documentos que
nenhum valor do array foi encontrado.
OPERADORES
$exists
$ db.pessoas.find({cursos: {$exists: 1}})
Busco os documentos que tenham o campo cursos
$all
$ db.pessoas.find({cursos: {$all: ["mysql", "mongodb"]}})
Ele funciona da mesma forma que o operador $in, a diferença é que precisa
existir todos os campos do array ou invés de apenas 1.
$size
$ db.pessoas.find({cursos: {$size: 3}})
Retorna os documentos no qual o tamanho do array corresponde ao procurado,
nesse caso o tamanho do array é 3
COMANDO UPDATE
Comando utilizado para fazer alterações em 1 ou mais documentos da nossa
coleção
A sintaxe para o comando update() é:
$ db.pessoas.update(critério, obj, upsert, multi)
critério // nossas condições para que aja a alteração
obj // o que será alterado
upsert // caso não exista, criaremos um novo documento
multi // alteramos mais de 1 registro que se enquadre no nosso critério
OPERADORES DE MODIFICAÇÕES
Iremos utilizar os operadores de modificações para alterar valores nos
documentos diretamente em nossa query do mongodb.
ex.
$ db.pessoas.update({criterios-busca}, {operador-modificacao}, upsert,
multi)
OPERADORES DE MODIFICAÇÕES
$set
$ db.pessoas.update({"nome": "eduardo"}, {$set: {saldo: 250.50}});
Seta um novo valor ao saldo de eduardo.
$unset
$ db.pessoas.update({"nome": "eduardo"}, {$unset: {saldo: 1}})
Deleta o campo saldo do documento de eduardo
$inc
$ db.pessoas.update({"nome": "eduardo"}, {$inc: {idade: 1}})
Incrementa o valor no campo que se não existir ele irá criar e atribuir o
valor, caso queira decrementar, basta passar o valor negativo.
$push
$ db.pessoas.update({"nome": "eduardo"}, {$push: {categoria: "estudante"}})
Adiciona ao campo categoria que é um array o valor estudante, caso o campo
categoria não exista ele irá criá-lo e se existir e não for um array ele
retornará uma mensagem de erro.
OPERADORES DE MODIFICAÇÕES
$pushAll
$ db.pessoas.update({"nome": "eduardo"}, {$pushAll: {categoria:
["estudante", "estagiario"]}})
Adiciona ao campo categoria todos os valores que estão dentro do array
(estudante e estagiario), caso o campo categoria não exista ele irá criá-lo
e se existir e não for um array ele retornará uma mensagem de erro.
$pull
$ db.pessoas.update({"nome": "eduardo"}, {$pull: {categoria: "estudante"}})
Remove o valor estudante do array categoria
$pullAll
$ db.pessoas.update({"nome": "eduardo"}, {$pullAll: {categoria:
["estudante", "estagiario"]}})
Remove todos os valores (estudante e categoria) do array categoria
COUNT
Da mesma forma que temos o operador count no mysql possuímos no mongodb.
Ex.
SELECT count(*) FROM pessoas
$ db.pessoas.count()
SELECT count(*) FROM pessoas WHERE idade < 18
$ db.pessoas.count({idade: {$lt: 18}})
ORDENAÇÃO
No mongodb podemos ordenar nossas consultas com o comando sort
Ex.
SELECT * FROM pessoas ORDER BY nome ASC
$ db.pessoas.find().sort({nome: 1})
SELECT * FROM pessoas ORDER BY idade DESC
$ db.pessoas.find().sort({idade: -1})
LIMIT
Colocaremos limites em nossas buscas
Ex.
SELECT * FROM pessoas ORDER BY nome ASC LIMIT 0,2
$ db.pessoas.find().sort({nome: 1}).limit(2)
SELECT * FROM pessoas LIMIT 2 OFFSET 10
$ db.pessoas.find().limit(2).skip(10)
//Buscando 2 documentos ignorando os 10 primeiros encontrados
REMOVE
Para apagarmos um documento ou limpar totalmente uma coleção usamos os
seguintes comando:
$ db.pessoas.remove({"nome": "eduardo"})
Apago todos os documentos que tenham o nome eduardo
$ db.pessoas.remove()
Apago todos os documentos
EXPLAIN
O comando explain é ótimo para auxiliá-lo na otimização de suas queries, da
mesma forma que no mysql ele trás muitas informações importantes.
$ db.pessoas.find().explain()
"cursor" : "BasicCursor", //tipo de índice usado
"isMultiKey" : false, // se índice múltiplo foi usado
"n" : 6, // numero de documento encontrados na busca
"nscannedObjects" : 6, // documentos escaneados
"nscanned" : 6, // numero de documentos e índices escaneados
"indexOnly" : false, // se a busca pode ser feita apenas pelo índice
"nYields" : 0, // numero de vezes que esperou um lock de leitura
"nChunkSkips" : 0, // numero de documento ignorados na migração de
chunks de sharding
"millis" : 0, // tempo de execução da query em milisegundos
"indexBounds" : {} // faixa de busca usada
ÍNDICES
Para melhorarmos nossa consulta é preciso que índices sejam criados em
nossas coleções, vale lembrar que nem sempre a criação de muitos índice
melhoram a performance da busca em muitos casos eles acabam atrapalhando.
Para criamos um índice utilizamos o comando ensureIndex()
$ db.pessoas.ensureIndex({nome: 1})
Para visualizarmos os índices da coleção utilizamos
$ db.pessoas.getIndexes()
Para visualizarmos todos os índices do banco de dados utilizamos uma coleção
do sistema
$ db.system.indexes.find()
E para deletar um índice utilize o comando
$ db.pessoas.dropIndex("nome_1")
RELACIONAMENTOS - DBREF
Por mais que o mongodb não seja um banco de dados relacional, existem
algumas formar que podemos utilizar para relacionarmos os documentos.
Acrescentando o ObjectId no documento e depois realizamos uma segunda busca
para retornar o documento relacionado ou podemos utilizar o DBRef que faz
essa ligação de forma automática.
$ db.turma.insert({curso: "angularjs", aluno: {$ref: "pessoas", $id:
"533b63f066b353505cb62bd2"}})
$ db.turma.find().pretty()
{
"_id" : ObjectId("533b8b5f66b353505cb62bd8"),
"curso" : "angularjs",
"aluno" : DBRef("pessoas", "533b63f066b353505cb62bd2")
}
db.turma.find({"aluno.$id": "533b63f066b353505cb62bd2"}) // Buscamos a turma
no qual o aluno está
REPLICA
Replicação no mongodb é uma obrigação, quedas dos servidores e paradas
bruscas do mongod podem corromper as coleções.
SHARDING
Você irá dividir em partes seus dados e distribui-los entre seus nós, cada
servidor de sharding configurado receberá dados levando em conta a shard
key.
GRIDFS
GridFS é o sistema de arquivos do mongodb e deve ser usado quando precisamos
armazenar aquivos maiores que 1mb.
Adicionando um arquivo
$ mongofiles -d nomedobanco put arquivo.mp3
Quando o arquivo é adicionado são criadas duas coleções uma fs.chunks que
contém o binário do arquivo e outra fs.files que são as informações do
arquivo como data de upload, nome e tamanho.
AGGREGATION FRAMEWORK
Após a versão 2.2 do mongodb os usuários podem realizar operações similares
ao group by do mysql utilizando a agregação, é possível filtrar documentos,
reduzir conjuntos, encontra valores mínimos e máximo ou agrupar documentos.
ex.
$ db.pessoas.aggregate({$group: {_id: "$idade", totalSaldo: {$sum:
"$saldo"}}},{$match: {totalSaldo: {$gte: 100.5}}})
No aggregate quando for referenciar um campo é preciso que ele venha
acompanhado com o $ como foi feito no campo idade e saldo.
REFERÊNCIAS
Documentação do MONGODB
http://docs.mongodb.org/
BE MEAN - Jean Carlo Nascimento
http://bemean.com.br/

MongoDB - Iniciando e Conhecendo

  • 1.
    Iniciando e conhecendo EdemilsonLuiz Gonçalves ede.goncalves88@gmail.com https://www.facebook.com/edegoncalves
  • 2.
    MONGODB • C++ • JSON/BSON •Replica • Sharding • GridFS • Aggregation Framework
  • 3.
    Terminologia: MYSQL eMONGODB MYSQL DATABASE TABLE ROWS QUERY INDEX PARTITION MONGODB DATABASE COLLECTION DOCUMENT JSON QUERY INDEX SHARD
  • 4.
    BANCO DE DADOSE COLEÇÃO Selecionando o banco de dados que iremos utilizar: use bancodedados Visualizando os nossos bancos de dados:show dbs Executando comandos:db.colecao.comando() ex: db.produtos.drop() // Apaga a coleção db.produtos.remove() // Limpa a coleção
  • 5.
    COMANDO INSERT Inserimos umdocumento novo no Banco de dados utilizando o comando insert $ db.pessoas.insert({"nome": "eduardo", "idade": 15, "saldo": 45.50}) Podemos utilizar valores que estão em variáveis $ var pessoa1 = {"nome": "eduardo", "idade": 15, "saldo": 45.50}; $ db.pessoas.insert(pessoa1);
  • 6.
    COMANDO SAVE Podemos recuperarum documento, fazer as modificações necessárias e salvá-lo novamente. $ var pessoa1 = db.pessoas.findOne(); $ pessoa1.idade = 16; $ db.pessoas.save(pessoa1);
  • 7.
    COMANDO CURSOR Todas asbuscas feitas através do find() irá retornar um cursor, vamos repeti-lo para retirarmos os valores. $ var cursor = db.pessoas.find(); A linguagem utilizada no mongodb é o javascript então vamos usar o comando forEach() $ cursor.forEach(function(pessoa){ printjson(data.nome) }) O comando acima irá listar os nomes de todas as pessoas cadastradas em nossa coleção.
  • 8.
    COMANDO FIND Para realizarconsultas no MongoDB utilizamos duas funções: find() // Retorna um array, mesmo sendo apenas 1 documento. findOne() // Retorna um único documento. A sintaxe para fazermos consultas é: $ db.pessoas.find({clausulas}, {campos}); $ db.pessoas.findOne({clausulas}, {campos}); ex: $ db.pessoas.findOne({"nome": "eduardo"}, {"idade": 1}) // Selecione apenas o campo idade. $ db.pessoas.findOne({"nome": "eduardo"}, {"idade": 0}) // Selecione o documento sem o campo idade.
  • 9.
    OPERADORES $lt $ db.pessoas.find({"idade": {$lt:18}}) Retorna os documentos com valores menores que 18 $lte $ db.pessoas.find({"idade": {$lte: 18}}) Retorna os documentos com valores menores ou igual a 18 $gt $ db.pessoas.find({"idade": {$gt: 18}}) Retorna os documentos com valores maiores que 18 $gte $ db.pessoas.find({"idade": {$gte: 18}}) Retorna os documentos com valores maiores ou igual a 18
  • 10.
    OPERADORES $or $ db.pessoas.find({"idade": 15,$or: [{"nome": "pedro"}, {"nome": "eduardo"}]}) Buscamos um documentos em que a idade seja igual a 15 e o nome seja pedro ou eduardo $nor $ db.pessoas.find({$nor: [{"nome": "pedro"}, {"nome": "eduardo"}]}) Buscamos um documentos em que o nome NÃO seja pedro ou eduardo $and $ db.pessoas.find({$and: [{"nome": "zeca"}, {"idade": {$lt: 15}}]}) Buscamos um documento em que nome seja zeca E idade menor que 15
  • 11.
    OPERADORES Existem campos quecontém um array e alguns operadores para utilizarmos neles $ne $ db.pessoas.find({cursos: {$ne: "mysql"}}) Buscamos dentro do campo cursos que é um array as pessoas que NÃO fizeram o curso de mysql $in $ db.pessoas.find({cursos: {$in: ["mysql", "mongodb"]}}) Buscamos as pessoas que fizeram o curso de mysql ou mongodb, lembrando que o $in espera sempre um array, mesmo que seja um único valor. $nin $ db.pessoas.find({cursos: {$nin: ["mysql", "mongodb"]}}) Retorna as pessoas que não fizeram curso de mysql ou mongodb. Documentos que nenhum valor do array foi encontrado.
  • 12.
    OPERADORES $exists $ db.pessoas.find({cursos: {$exists:1}}) Busco os documentos que tenham o campo cursos $all $ db.pessoas.find({cursos: {$all: ["mysql", "mongodb"]}}) Ele funciona da mesma forma que o operador $in, a diferença é que precisa existir todos os campos do array ou invés de apenas 1. $size $ db.pessoas.find({cursos: {$size: 3}}) Retorna os documentos no qual o tamanho do array corresponde ao procurado, nesse caso o tamanho do array é 3
  • 13.
    COMANDO UPDATE Comando utilizadopara fazer alterações em 1 ou mais documentos da nossa coleção A sintaxe para o comando update() é: $ db.pessoas.update(critério, obj, upsert, multi) critério // nossas condições para que aja a alteração obj // o que será alterado upsert // caso não exista, criaremos um novo documento multi // alteramos mais de 1 registro que se enquadre no nosso critério
  • 14.
    OPERADORES DE MODIFICAÇÕES Iremosutilizar os operadores de modificações para alterar valores nos documentos diretamente em nossa query do mongodb. ex. $ db.pessoas.update({criterios-busca}, {operador-modificacao}, upsert, multi)
  • 15.
    OPERADORES DE MODIFICAÇÕES $set $db.pessoas.update({"nome": "eduardo"}, {$set: {saldo: 250.50}}); Seta um novo valor ao saldo de eduardo. $unset $ db.pessoas.update({"nome": "eduardo"}, {$unset: {saldo: 1}}) Deleta o campo saldo do documento de eduardo $inc $ db.pessoas.update({"nome": "eduardo"}, {$inc: {idade: 1}}) Incrementa o valor no campo que se não existir ele irá criar e atribuir o valor, caso queira decrementar, basta passar o valor negativo. $push $ db.pessoas.update({"nome": "eduardo"}, {$push: {categoria: "estudante"}}) Adiciona ao campo categoria que é um array o valor estudante, caso o campo categoria não exista ele irá criá-lo e se existir e não for um array ele retornará uma mensagem de erro.
  • 16.
    OPERADORES DE MODIFICAÇÕES $pushAll $db.pessoas.update({"nome": "eduardo"}, {$pushAll: {categoria: ["estudante", "estagiario"]}}) Adiciona ao campo categoria todos os valores que estão dentro do array (estudante e estagiario), caso o campo categoria não exista ele irá criá-lo e se existir e não for um array ele retornará uma mensagem de erro. $pull $ db.pessoas.update({"nome": "eduardo"}, {$pull: {categoria: "estudante"}}) Remove o valor estudante do array categoria $pullAll $ db.pessoas.update({"nome": "eduardo"}, {$pullAll: {categoria: ["estudante", "estagiario"]}}) Remove todos os valores (estudante e categoria) do array categoria
  • 17.
    COUNT Da mesma formaque temos o operador count no mysql possuímos no mongodb. Ex. SELECT count(*) FROM pessoas $ db.pessoas.count() SELECT count(*) FROM pessoas WHERE idade < 18 $ db.pessoas.count({idade: {$lt: 18}})
  • 18.
    ORDENAÇÃO No mongodb podemosordenar nossas consultas com o comando sort Ex. SELECT * FROM pessoas ORDER BY nome ASC $ db.pessoas.find().sort({nome: 1}) SELECT * FROM pessoas ORDER BY idade DESC $ db.pessoas.find().sort({idade: -1})
  • 19.
    LIMIT Colocaremos limites emnossas buscas Ex. SELECT * FROM pessoas ORDER BY nome ASC LIMIT 0,2 $ db.pessoas.find().sort({nome: 1}).limit(2) SELECT * FROM pessoas LIMIT 2 OFFSET 10 $ db.pessoas.find().limit(2).skip(10) //Buscando 2 documentos ignorando os 10 primeiros encontrados
  • 20.
    REMOVE Para apagarmos umdocumento ou limpar totalmente uma coleção usamos os seguintes comando: $ db.pessoas.remove({"nome": "eduardo"}) Apago todos os documentos que tenham o nome eduardo $ db.pessoas.remove() Apago todos os documentos
  • 21.
    EXPLAIN O comando explainé ótimo para auxiliá-lo na otimização de suas queries, da mesma forma que no mysql ele trás muitas informações importantes. $ db.pessoas.find().explain() "cursor" : "BasicCursor", //tipo de índice usado "isMultiKey" : false, // se índice múltiplo foi usado "n" : 6, // numero de documento encontrados na busca "nscannedObjects" : 6, // documentos escaneados "nscanned" : 6, // numero de documentos e índices escaneados "indexOnly" : false, // se a busca pode ser feita apenas pelo índice "nYields" : 0, // numero de vezes que esperou um lock de leitura "nChunkSkips" : 0, // numero de documento ignorados na migração de chunks de sharding "millis" : 0, // tempo de execução da query em milisegundos "indexBounds" : {} // faixa de busca usada
  • 22.
    ÍNDICES Para melhorarmos nossaconsulta é preciso que índices sejam criados em nossas coleções, vale lembrar que nem sempre a criação de muitos índice melhoram a performance da busca em muitos casos eles acabam atrapalhando. Para criamos um índice utilizamos o comando ensureIndex() $ db.pessoas.ensureIndex({nome: 1}) Para visualizarmos os índices da coleção utilizamos $ db.pessoas.getIndexes() Para visualizarmos todos os índices do banco de dados utilizamos uma coleção do sistema $ db.system.indexes.find() E para deletar um índice utilize o comando $ db.pessoas.dropIndex("nome_1")
  • 23.
    RELACIONAMENTOS - DBREF Pormais que o mongodb não seja um banco de dados relacional, existem algumas formar que podemos utilizar para relacionarmos os documentos. Acrescentando o ObjectId no documento e depois realizamos uma segunda busca para retornar o documento relacionado ou podemos utilizar o DBRef que faz essa ligação de forma automática. $ db.turma.insert({curso: "angularjs", aluno: {$ref: "pessoas", $id: "533b63f066b353505cb62bd2"}}) $ db.turma.find().pretty() { "_id" : ObjectId("533b8b5f66b353505cb62bd8"), "curso" : "angularjs", "aluno" : DBRef("pessoas", "533b63f066b353505cb62bd2") } db.turma.find({"aluno.$id": "533b63f066b353505cb62bd2"}) // Buscamos a turma no qual o aluno está
  • 24.
    REPLICA Replicação no mongodbé uma obrigação, quedas dos servidores e paradas bruscas do mongod podem corromper as coleções.
  • 25.
    SHARDING Você irá dividirem partes seus dados e distribui-los entre seus nós, cada servidor de sharding configurado receberá dados levando em conta a shard key.
  • 26.
    GRIDFS GridFS é osistema de arquivos do mongodb e deve ser usado quando precisamos armazenar aquivos maiores que 1mb. Adicionando um arquivo $ mongofiles -d nomedobanco put arquivo.mp3 Quando o arquivo é adicionado são criadas duas coleções uma fs.chunks que contém o binário do arquivo e outra fs.files que são as informações do arquivo como data de upload, nome e tamanho.
  • 27.
    AGGREGATION FRAMEWORK Após aversão 2.2 do mongodb os usuários podem realizar operações similares ao group by do mysql utilizando a agregação, é possível filtrar documentos, reduzir conjuntos, encontra valores mínimos e máximo ou agrupar documentos. ex. $ db.pessoas.aggregate({$group: {_id: "$idade", totalSaldo: {$sum: "$saldo"}}},{$match: {totalSaldo: {$gte: 100.5}}}) No aggregate quando for referenciar um campo é preciso que ele venha acompanhado com o $ como foi feito no campo idade e saldo.
  • 28.
    REFERÊNCIAS Documentação do MONGODB http://docs.mongodb.org/ BEMEAN - Jean Carlo Nascimento http://bemean.com.br/