MAC439 Laboratório de Bancos de Dados
Introdução ao MongoDB
Parte 2
Operações de Modificação de Dados
Kelly Rosa Braghetto
kellyrb@ime.usp.br
Funções para modificação de
documentos
●Principais operações:
–db.collection.insertOne()
–db.collection.insertMany()
–db.collection.updateOne()
–db.collection.updateMany()
–db.collection.replaceOne()
–db.collection.deleteOne()
–db.collection.deleteMany()
https://docs.mongodb.com/manual/crud/Funções para modificação de
documentos
No MongoDB:
●
Todas as operações de modificação são aplicáveis a uma
só coleção por vez
●
Nas escritas, a atomicidade é em nível de documento
(ainda que a operação abranja mais de um documento por
vez)
Inserção de documentos
●
Forma geral dos comandos de criação:
db.<nome_coleção>.insertOne( { <documento> }, { writeConcern: <documento> } ); db.<nome_coleção>.insertMany( { [<documento>,<documento>, … ] }, { writeConcern: <documento>, ordered: <boolean> } );
Documento a ser inserido Parâmetros de configuração da inserção (opcionais) Documentos a serem inseridos Parâmetros de configuração da inserção (opcionais)
Inserção de documentos
Função: insertOne
● A função insertOne insere um documento em uma coleção no BD em uso ● O comando abaixo cria o documento de MAC0439 na coleção disciplinas:
db.disciplinas.insertOne( { _id: 1,
"codigo": "MAC0439", "nome": "Laboratório de Bancos de Dados", "creditos_aula": 4, "creditos_trabalho": 2,
"ativacao": ISODate("2017-01-01T00:00:00-03"),
"avaliacao": ["provas","exercícios","projetos"]});
● Resposta:
Criação de documentos
Função: insertMany
● A função insertMany vários documentos de uma só vez em uma coleção ● Exemplo:
db.disciplinas.insertMany(
[{ _id: 2,"codigo": "MAC0426", "nome": "Sistemas de Bancos de Dados"}, { _id: 3,"codigo": "MAC0110", "nome": "Introdução à Computação"},
{ _id: 4,"codigo": "MAC0216", "nome": "Técnicas de Programação I"} ]);
● Resposta:
Identificação de objetos
●
Todo documento em uma coleção deve ter, obrigatoriamente, um
campo chamado _id que funciona como chave primária para o
documento
– O valor de _id pode ser de qualquer tipo de dado
– O valor de _id precisa ser único dentro da coleção, caso contrário
gerará um erro de chave duplicada na inserção
●
Se na criação de um documento o campo _id não for definido, o
MongoDB atribuirá um valor do tipo ObjectId para o campo
Criação automática de valor para _id
db.disciplinas.insertOne(
{ "codigo": "MAC0439", "nome": "Laboratório de Bancos de Dados", "creditos_aula": 4, "creditos_trabalho": 2, "ativacao": ISODate("2017-01-01T00:00:00-03"), "avaliacao": ["provas","exercícios","projetos"] }); ● Resposta: { "acknowledged" : true, "insertedId" : ObjectId("5ecad12b7d9a94b2e3ccf440") }
Criação de valor para _id com a
função ObjectId()
db.disciplinas.insertOne( { _id: ObjectId(),
"codigo": "MAC0439", "nome": "Laboratório de Bancos de Dados", "creditos_aula": 4, "creditos_trabalho": 2, "ativacao": ISODate("2017-01-01T00:00:00-03"), "avaliacao": ["provas","exercícios","projetos"] }); ● Resposta: { "acknowledged" : true, "insertedId" : ObjectId("5ecad4917d9a94b2e3ccf441") }
Identificação de objetos com
ObjectId
●
Um valor do tipo ObjectId ocupa 12 bytes:
–
4 bytes com o timestamp da criação do ID
–5 bytes com um valor aleatório
–
3 bytes com um contador, iniciado com um valor aleatório
●
Essa combinação gera valores que, apesar de relativamente
pequenos, são únicos (para propósitos práticos) e ordenáveis
Identificação de objetos com
ObjectId
●
Ordenar documentos pelo campo _id quando ele contém valores do
tipo ObjectId é (quase) o mesmo que ordená-los por sua data e hora
de criação
–
A resolução do
“relógio
“do ObjectId é de apenas um segundo,
portanto não há garantia de ordem para valores de ObjectId
criados dentro de um mesmo segundo
–
Valores de ObjectIds são criados pelos nós clientes, que podem
ter relógios de sistema diferentes
Valores do tipo Date
(datas e horários)
●Valores do tipo Date são armazenados internamente pelo MongoDB como números
inteiros de 64 bits
●Para obter um objeto do tipo Date, usa-se a função ISODate() ou o construtor de Date ●Quando não se passa uma data no parâmetro, obtém-se a data e hora atual
db.disciplinas.insertOne(
{ "codigo": "MAC0439", "nome": "Laboratório de Bancos de Dados", "ativacao": ISODate("2017-01-01T00:00:00-03"),
"cadastro": ISODate() });
ou
db.disciplinas.insertOne(
{ "codigo": "MAC0439", "nome": "Laboratório de Bancos de Dados", "ativacao": new Date("2017-01-01T00:00:00-03"),
"cadastro": new Date()
Inserção de documentos
Parâmetro $writeConcern
●
O parâmetro writeConcern descreve o nível de garantia que o
MongoDB deve prover para que a operação de inserção seja
considerada "executada com sucesso".
●
Esse parâmetro define, por exemplo, o quórum de escrita – o número
de réplicas que devem responder para o nó primário do sistema
afirmando que receberam a atualização de um documento.
●
Exemplos:
writeConcern:{w:'majority'}
ou
writeConcern: { w: 2, wtimeout: 5000}
Inserção de documentos
Exemplo com $writeConcern e $ordered
db.disciplinas.insertMany(
[{ "codigo": "MAC0426", "nome": "Sistemas de Bancos de Dados"}, { "codigo": "MAC0110", "nome": "Introdução à Computação"},
{ "codigo": "MAC0216", "nome": "Técnicas de Programação I"}],
{writeConcern: { w: 1, wtimeout: 5000}, ordered: 1});
● O comando de inserção acima exige que a escrita seja confirmada em pelo
menos dois nós do sistema
– Para que ele possa ser executado com sucesso, o coleção disciplinas
precisa ter pelo menos duas réplicas
● Os documentos serão inseridos na mesma ordem em que aparecem no
Alteração de documentos
●
Forma geral do comando de alteração updateOne:
db.collection.updateOne( <condições de filtro>, <modificações>, { upsert: <boolean>, writeConcern: <document>, collation: <document>, arrayFilters: [ <condição1>, ... ], hint: <document|string>});
●
A estrutura do comando updateMany é similar
Critérios para a seleção do documento p/ alteração
Parâmetros de configuração da alteração (opcionais)
Alteração de documentos
Exemplo: função updateOne
● Usa-se o operador $set para indicar as alterações a serem feitas no(s)
documento(s)
● Ex. 1: o comando abaixo altera (ou inclui, caso ele ainda não exista) o atributo
numero_creditos na disciplina de código MAC0216: db.disciplinas.updateOne(
{"codigo":"MAC0216"},
{$set:{"creditos_aula":6}} );
● Resposta:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Alteração de documentos
Exemplo: função updateMany
● Ex. 2: o comando abaixo altera (ou inclui, caso ele ainda não exista) o atributo
numero_creditos nas disciplinas que têm MAC no prefixo do código
db.disciplinas.updateMany(
{"codigo":/^MAC/},
{$set:{"creditos_aula":6}}
);
● Resposta:
Operadores para a alteração de
campos de um documento
●
Podem ser usados dentro dos comandos updateOne e updateMany:
– $set: atribui valor a campos– $unset: remove campos do documento – $rename: renomeia campos
– $inc: incrementa o valor de campos adicionando um dado valor – $mul: multiplica o valor de campos por um dado valor
– $currentDate: atribui a data atual a campos
– $min: altera o campo com um dado valor se este último for menor que o
valor atual do campo
– $max: altera o campo com um dado valor se este último for maior que o
valor atual do campo
Operadores para a alteração de
campos de um documento
● Ex. 3: o comando abaixo incrementa em a quantidade de créditos de
MAC0439, remove o campo
avaliacao
e renomeia o camponome
paranome_disciplina
:db.disciplinas.updateOne(
{"codigo":"MAC0439"},
{$inc:{"creditos_aula": 2, "creditos_trabalho": 2},
$unset:{"avaliacao": ""},
$rename:{"nome":"nome_disciplina"}});
● Resposta:Alterações de documentos
Operadores para arrays
Operadores que podem ser usados com a update para atributos do tipo array:
● $addToSet : Adic. elementos a um vetor se não existirem ainda ● $pop: Remove o primeiro (-1) ou o último item (1) de um vetor
● $pull: Remove de um vetor todos os valores que satisfazem um dado critério
de busca
● $pullAll: Remove de um vetor todas as ocorrências de valores especificados ● $push: Adiciona um elemento a um vetor (mesmo se ele já existir)
...
Alterações de documentos
Exemplo: operador $push
db.alunos.insertOne({"nusp": 12345,
"notas": {"MAC0439":[10,8,10,9],"MAC0426":[6,9,10,7]}});
● Adiciona as notas 6 e 4 nas notas do MAC0426 do aluno com NUSP =
12345: db.alunos.updateOne({"nusp": 12345}, {$push:{ "notas.MAC0426":{$each:[6,4]} } });
Alterações de documentos
Exemplo: operadore $pull e $pullAll
●
Remove as notas de MAC426 menores do que 5 de todos os alunos:
db.alunos.updateMany({},
{$pull:{"notas.MAC0426":{$lt:5}}});
●
Remove todas as notas 9 e 10 de MAC0426 de todos os alunos:
db.alunos.updateMany({},
Alterações de documentos
Exemplo: operador $pop
●
Remove a primeira nota de MAC0439 do aluno com NUSP = 12345:
db.alunos.updateOne({"nusp": 12345},
{$pop:{"notas.MAC0439":-1}});
●
Remove a última nota de MAC0439 do aluno com NUSP = 12345:
db.alunos.updateOne({"nusp": 12345},
{$pop:{"notas.MAC0426":1}});
Alteração de documentos
●
Parâmetros opcionais das funções de update:
– upsert: quando true (1), indica que o documento será adicionado à
coleção caso nenhum dos documentos existentes satisfaça a condição de busca
● o valor default de upsert é false
– writeConcern: igual ao das funções de inserção
– collation: configurações para a comparação de strings
– arrayFilters: determina quais elementos de um array devem ser
modificados quando o update alterar um campo do tipo array
– hint: especifica o índice a ser usado para apoiar a execução do comando
Alteração de documentos
Exemplo com $upsert:true
●
Ex. 4: o comando abaixo tenta alterar o campo creditos_aula da
disciplina de código
MAC0218, mas caso não exista um documento com
esse código de disciplina, ele cria o documento na coleção:
db.disciplinas.updateOne(
{"codigo":"MAC0218"},
{$set:{"creditos_aula":4}},
{upsert:true}
Substituição de documentos
●
A função replaceOne substitui um documento da coleção por um
outro documento.
●
Forma geral do comando replaceOne:
db.collection.replaceOne( <condições de filtro>, <documento substituto>, { upsert: <boolean>, writeConcern: <document>, collation: <document>, hint: <document|string>});
Critérios para a seleção do documento a ser substituído
Parâmetros de configuração da substituição (opcionais) Documento que substituirá
Substituição de documentos
●Exemplo:
db.disciplinas.replaceOne( {"codigo":"MAC0218"},
{"cod_disciplina": "MAC0218",
"nome": "Técnicas de Programação II",
"creditos_aula": 4, "creditos_trabalho": 2,
"ativacao": ISODate("2018-01-01T00:00:00-03"), "avaliacao": ["provas","exercícios"]});
●
Resposta:
Alternativa para a alteração de documentos:
findOne + replaceOne
● Uma outra forma de atualizar parcialmente um documento é armazená-lo
em uma variável, atualizá-lo e depois gravar o conteúdo da variável no BD, como ilustrado no exemplo abaixo:
var disc =
db.disciplinas.findOne({"codigo":"MAC0439"}); // muda o código
disc.codigo = "MAC0439-B";
// adiciona ou modifica o campo professor disc.professor = "Kelly Rosa Braghetto";
Alternativa para a alteração de documentos
find + replaceOne
● O código em JavaScript a seguir cria ou modifica o atributo departamento de
todas as disciplinas que têm MAC como prefixo do código: var cursor = db.disciplinas.find({"codigo":/^MAC/}); var disc; while (cursor.hasNext()) { disc = cursor.next(); disc.departamento = "computação"; db.disciplinas.replaceOne({_id:disc._id},disc); }
Remoção de documentos
● Forma geral dos comandos de remoção:
db.<nome_da_coleção>.deleteOne( { <criterio_selecao1>:<valor1>, <criterio_selecao2>:<valor2>, … }, { writeConcern: <documento>, collation: <documento>}); db.<nome_da_coleção>.deleteMany( { <criterio_selecao1>:<valor1>, <criterio_selecao2>:<valor2>, … }, { writeConcern: <documento>, collation: <documento>}); Critérios para a seleção do documento a ser removido Critérios para a seleção dos documentos a serem removidos Parâmetros de configuração da remoção (opcionais) Parâmetros de configuração da remoção (opcionais)
Remoção de documentos
● Ex. 1: Remove a primeira disciplina que encontrar com código MAC0216
db.disciplinas.deleteOne({"codigo": "MAC0216"});
● Ex. 2: Remove todas as disciplinas com prefixo MAC ou MAT
db.disciplinas.deleteMany(
{ $or:[{"codigo":/^MAC/}, {"codigo":/^MAT/}] } );
● Ex. 3: Remove todas as disciplinas
Remoção de coleções e BDs
●
Para apagar a coleção
<nome_coleção>
:
●
Para apagar o banco de dados atualmente em uso:
db.dropDatabase();
Referências Bibliográficas
● Documentação do MongoDB – https://docs.mongodb.com/ ● Tutoriais oficiais: – https://docs.mongodb.com/manual/ – https://docs.mongodb.com/getting-started/shell/● Mapeamento de SQL para MongoDB
– http://s3.amazonaws.com/info-mongodb-com/sql_to_mongo.pdf
– https://docs.mongodb.com/manual/reference/sql-comparison/
● Livro:
– ‘‘MongoDB: The Definitive Guide, 3rd Edition (2019) – Powerful and Scalable Data