Omet navegació

3.3.3.1 - $set

El modificador $set assigna un valor a un camp del document seleccionat de la Base de Dades. Si el camp ja existia, modificarà el valor, i si no existia el crearà.

La sintaxi del modificador $set és la següent:

{ $set : { clau : valor} }

Però recordeu que és un modificador, i l'hem d'utilitzar dins d'una operació d'actualització. Anirà en el segon paràmetre del update(), i per tant amb aquestos modificadors ja no posem tot el document en el segon paràmetre, sinó únicament l'operador de modificació.

Mirem-ho millor en un exemple:

> db.alumnes.insert( {nom:"Abel", cognoms:"Bernat Carrera"} )
WriteResult({ "nInserted" : 1 })
>
> db.alumnes.findOne()
{
    "_id" : ObjectId("56debe3017bf4ed437dc77c8"),
    "nom" : "Abel",
    "cognoms" : "Bernat Carrera"
}
>

Suposem ara que li volem afegir l'edat. Abans ho faríem guardant el document en una variable, i afegint el camp, per a guardar després. Ara ho tenim més fàcil:

> db.alumnes.update( {nom:"Abel"} , { $set: {edat:21} } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Ha trobat un, i l'ha modificat. Evidentment, si hi haguera més d'un alumne a mb el nom Abel, els modificaria tots.

> db.alumnes.findOne()
{
    "_id" : ObjectId("56debe3017bf4ed437dc77c8"),
    "nom" : "Abel",
    "cognoms" : "Bernat Carrera",
    "edat" : 21
}

Es pot especificar més d'un camp amb els valor corresponents. Si no existien es crearan, i si ja existien es modificaran:

> db.alumnes.update( {nom:"Abel"} , { $set: {nota: 8.5 , edat:22} } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.alumnes.findOne()
{
    "_id" : ObjectId("56debe3017bf4ed437dc77c8"),
    "nom" : "Abel",
    "cognoms" : "Bernat Carrera",
    "edat" : 22,
    "nota" : 8.5
}

I fins i tot es pot canviar el tipus d'un camp determinat, i utilitzar arrays, i objectes, ...

> db.alumnes.update( {nom:"Abel"} , { $set: {nota: [8.5,7.5,9] , adreça:{carrer:"Major",numero:7,cp:"12001"}  } } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.alumnes.findOne()
{
    "_id" : ObjectId("56debe3017bf4ed437dc77c8"),
    "nom" : "Abel",
    "cognoms" : "Bernat Carrera",
    "edat" : 22,
    "nota" : [
        8.5,
        7.5,
        9
    ],
    "adreça" : {
        "carrer" : "Major",
        "numero" : 7,
        "cp" : "12001"
    }
}

Podem fins i tot modificar ara només el valor d'un camp d'un objecte del document. Per exemple, anem a modificar el codi postal de l'anterior alumne. La manera d'arribar al codi postal serà adreça.cp, però haurem d'anar amb compte que vaja entre cometes per a que el trobe:

>  db.alumnes.update( {nom:"Abel"} , { $set: {adreça.cp:"12502"} } )
2016-03-08T13:19:59.744+0100 E QUERY    [thread1] SyntaxError: missing : after property id @(shell):1:49

> db.alumnes.update( {nom:"Abel"} , { $set: {"adreça.cp":"12502"} } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.alumnes.findOne()
{
    "_id" : ObjectId("56debe3017bf4ed437dc77c8"),
    "nom" : "Abel",
    "cognoms" : "Bernat Carrera",
    "edat" : 22,
    "nota" : [
        8.5,
        7.5,
        9
    ],
    "adreça" : {
        "carrer" : "Major",
        "numero" : 7,
        "cp" : "12502"
    }
}