Já vimos aqui no blog os posts:
Neste post vamos falar sobre o comando update(), que pode ser utilizado para atualizar um único documento ou, se necessário, múltiplos documentos utilizando a opção multi. O método update() possui os seguintes parâmetros:
- uma condição para cruzar com o documento a ser atualizado;
- uma operação que especificará qual é a modificação a ser realizada;
- opções adicionais, como a multi.
Existem diversos operadores que são utilizados no método update(). Um dos principais é o $set que modifica os campos de um documento. Como exemplo, temos a collection grades que possui a seguinte estrutura de documento:
> db.grades.findOne()
{
"_id" : ObjectId("50b59cd75bed76f46522c34e"),
"student_id" : 0,
"class_id" : 2,
"scores" : [
{
"type" : "exam",
"score" : 57.92947112575566
},
{
"type" : "quiz",
"score" : 21.24542588206755
},
{
"type" : "homework",
"score" : 68.1956781058743
},
{
"type" : "homework",
"score" : 67.95019716560351
},
{
"type" : "homework",
"score" : 18.81037253352722
}
]
Um mesmo "student_id" pode conter diferentes campos "class_id". Vamos então atualizar a nota do homework do estudante 0 com class_id igual a 10. Este documento inicialmente está:
> db.grades.find({"student_id": 0,"class_id":10}).pretty()
{
"_id" : ObjectId("50b59cd75bed76f46522c358"),
"class_id" : 10,
"scores" : [
{
"type" : "exam",
"score" : 30.93065784731665
},
{
"type" : "quiz",
"score" : 55.98003281528393
},
{
"type" : "homework",
"score" : 55.6752702814148
},
],
"student_id" : 0
Então, para atualizar a nota do homework de 55.76 para 70, fazemos:
> db.grades.update(
{"student_id":0,"class_id":10,"scores.type":"homework"},
{$set:
{ "scores.$.score":70.00 },
}
)
A sintaxe é a seguinte:
- {"student_id":0,"class_id":10,"scores.type":"homework"} - representa que queremos o "student_id":0 e "class_id":10 e o campo scores onde o tipo é o homework. Utilizamos a notação ponto "scores.type" pois os tipos de scores são documentos aninhados dentro de um array;
- { "scores.$.score":70.00 } - o operador $ indica que iremos atualizar um valor dentro de um array, que é o score dentro de scores com o valor de 70.00;
Assim, nosso documento atualizado ficou:
> db.grades.find({"student_id": 0,"class_id":10}).pretty()
{
"_id" : ObjectId("50b59cd75bed76f46522c358"),
"class_id" : 10,
"scores" : [
{
"type" : "exam",
"score" : 30.93065784731665
},
{
"type" : "quiz",
"score" : 55.98003281528393
},
{
"score" : 70.00,
"type" : "homework"
},
{
"type" : "homework",
"score" : 63.15391302252755
}
],
"student_id" : 0
}
Agora, se quisermos atualizar todas as notas de homework do "student_id":0, basta fazermos a operação abaixo. Note que adicionamos a opção { multi: true} para indicar que vamos atualizar múltiplos documentos.
> db.grades.update(
{"student_id":0,"scores.type":"homework"},
{$set:
{ "scores.$.score":70.00 },
},
{ multi: true}
)
{$set:
{ "scores.$.score":70.00 },
},
{ multi: true}
)
Um abraço e até o próximo post!
0 comentários:
Postar um comentário