Neste post estarei mostrando alguns comandos para atualização de documentos, o conhecido update do SQL.
Para atualizar um documento podemos utilizar:
db.funcionarios.update({}, {}) onde o primeiro parâmetro é a condição do que queremos atualizar, seria o where do SQL e o segundo é o valor que será atualizado.
Mas passando um update desta forma fazemos com que o mongo intenda que estamos atualizando um documento inteiro que é o padrão dele.
Para atualizar o campo de um documento podemos utilizar:
db.funcionarios.update(
{ "departamento.nome" : "RH"},
{ $set : {"departamento.nome" : "Recursos humanos"}}
)
Mas como disse anteriormente o padrão do mongo é atualizar um documento, mesmo que estejamos passando o set para atualizar apenas um campo e na condição passamos uma condição onde possam ter vários registros, ele só vai atualizar o primeiro que encontrar.
Para atualizar todas as linhas encontradas temos que avisar ao mongo que é isso que desejamos, utilizando o multi:
db.funcionarios.update(
{ "departamento.nome" : "RH"},
{ $set : {"departamento.nome" : "Recursos humanos"}},
{ multi : true }
)
Agora e quando queremos adicionar um valor a um documento? Imagine que estou em um banco de dados de controle de alunos e esses alunos podem ter várias notas, ou seja tenho um db.alunos contendo um .notas.
Para adicionar um valor a um documento, temos uma opção que é o $push:
db.alunos.update(
{"_id" : ObjectId("16db0004b8d72ea12f75d3b9")},
{ $push : { notas : 7.0 } }
)
Certo e caso eu queira adicionar mais de uma nota de uma só vez?
Para adicionar mais de um valor no push temos que utilizar o comando each
db.alunos.update(
{"_id" : ObejctId("16db0004b8d72ea12f75d3b9")},
{ $push : { "notas" : {$each : [7.5, 5.0] } }}
)
Existem muitas outras opções como o $inc que serve para incrementar um valor, como por exemplo foi adicionada a nota de um aluno como 7.5, mas o mesmo teve trabalhos extras que valeram mais um ponto, poderíamos utilizar o inc para adicionar 1 à nota ficando com 8.5.
Ou o $currentDate que seta a data atual à um campo.