O documento resume os principais conceitos e comandos do MongoDB, incluindo como selecionar e visualizar bancos de dados e coleções, inserir, consultar, atualizar e remover documentos, criar índices, realizar relacionamentos entre coleções e utilizar recursos como sharding, replica e aggregation framework.
3. Terminologia: MYSQL e MONGODB
MYSQL
DATABASE
TABLE
ROWS
QUERY
INDEX
PARTITION
MONGODB
DATABASE
COLLECTION
DOCUMENT JSON
QUERY
INDEX
SHARD
4. 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
5. 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);
6. 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);
7. 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.
8. 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.
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 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.
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 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
14. 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)
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 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}})
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})
19. 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
20. 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
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 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")
23. 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á
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á 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.
26. 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.
27. 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.