mongodb - iniciando e conhecendo
DESCRIPTION
Slide apresentado para usuários do MYSQL onde haverá a mudança da base de dados para MONGODB.TRANSCRIPT
Iniciando e conhecendo
Edemilson Luiz Gonç[email protected] 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çãodb.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 MONGODBhttp://docs.mongodb.org/
BE MEAN - Jean Carlo Nascimentohttp://bemean.com.br/