segunda-feira, 24 de novembro de 2014

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}
                              )



Um abraço e até o próximo post!

0 comentários:

Postar um comentário