Salta el contingut

DAM - DAW - MP 0484 Bases de Dades

Actualització de documents

A MongoDB, les operacions d'actualització tenen com a objectiu una única col·lecció. Totes les operacions d'escriptura a MongoDB són atòmiques a nivell d'un sol document.

Podem especificar criteris o filtres que identifiquin els documents a actualitzar. Aquests filtres utilitzen la mateixa sintaxi que les operacions de cerca.

Per actualitzar les dades en una base de dades MongoDB utilitzarem el mètode updateOne, updateMany o replaceOne. En versions anteriors teniem el mètode update.

db.collection.updateOne(<filter>, <update>, <options>)
db.collection.updateMany(<filter>, <update>, <options>)
db.collection.replaceOne(<filter>, <update>, <options>)

Cal especificar amb quina Col·lecció estem treballant. La opció upsert permet crear un document nou si no se'n troba cap que compleixi el filtre de la selecció.

En versions anteriors hi havia el mètode update que englobava el updateOne i el updateMany amb el paràmetre multi

updateOne

db.collection.updateOne(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        // Available starting in MongoDB 4.2.1
   }
)

updateMany

db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string>        // Available starting in MongoDB 4.2.1
   }
)

replaceOne

db.collection.replaceOne(
   <filter>,
   <replacement>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     hint: <document|string>                   // Available starting in 4.2.1
   }
)

Operadors

MongoDB permet molts operadors per actualitzar documents:

  • $set: definiex la clau que s’actualitzarà (o que es crearà si no existeix)

  • $currentDate: estableix el valor d'un camp a la data actual, ja sigui com a Date o com a timestamp

  • $inc: incrementa el valor d’un camp numèric

  • $min: només actualitza el camp si el valor especificat és inferior al valor del camp existent

  • $max: només actualitza el camp si el valor especificat és superior al valor del camp existent

  • $mul: multiplica el valor del camp per la quantitat especificada

  • $rename: renombra el nom d’una clau

  • $unset: defineix la clau que s’eliminarà del document

  • $pull: elimina els valors d’un array que compleixen el filtre

  • $pullAll: elimina els valors especificats d’un array

  • $pop: elimina el primer o darrer valor d’un array

  • $push: afegeix un element a un array

  • $addToSet: afegeix elements a un array si no existeix

  • $each: s’utilitza amb $addToSet o $push per permetre l’agregació múltiple d’elements a un array.

  • i molts més que podeu consultar a l'enllaç

Exemples

Modificarem les quantitats d'articles de la Col·lecció inventory de la següent forma:

Modifiquem quantitats i comprovem cada actualització
db.inventory.find({qty : { $lte : 30 }})
db.inventory.updateOne({qty : { $lte : 30 }}, {$inc: {"qty":1}})
db.inventory.find({qty : { $lte : 30 }})
db.inventory.updateMany({qty : { $lte : 30 }}, {$inc: {"qty":1}})
db.inventory.find({qty : { $lte : 30 }})
db.inventory.updateMany({qty : { $lte : 30 }}, {$set: {"qty":25}})
db.inventory.find({qty : { $lte : 30 }})
Passem totes les mesures a cm
db.inventory.updateMany(
  { "size.uom" : "in" } , 
  { 
    $mul: {
      "size.h": 2.54,
      "size.w": 2.54 
    },
    $set: {"size.uom": "cm" }
  }
)

Partint dels 4 alumnes que tenim al principi provarem el següent:

Afegirem a Mòduls de l’alumne Joan el Mòdul M05. Primer ens equivocarem posant M5, després l’eliminem i el tornem a afegir correctament.

Afegim mòduls a alguns alumnes
db.alumnes.updateOne({Nom:"Joan"},{$push: {Moduls:"M5"}})
db.alumnes.find({Nom:"Joan"}).pretty()
db.alumnes.updateOne({Nom:"Joan"},{$pull: {Moduls:"M5"}})
db.alumnes.find({Nom:"Joan"}).pretty()
db.alumnes.updateOne({Nom:"Joan"},{$push: {Moduls:"M05"}})
db.alumnes.find({Nom:"Joan"}).pretty()

Cal fixar-se en el resultat del MongoDB per saber a quants documents afecta la selecció i quants realment en modifiquem (nMatched i nModified).

Canviem el Cognom d’en Cateura per Kateura
db.alumnes.updateOne({Cognoms:"Cateura"},{$set: {Cognoms:"Kateura"}})
Afegim un camp Matriculat amb valor SI a tothom
db.alumnes.update({},{$set: {Matriculat:"SI" }})

Aquesta instrucció només actualitza UN document.

Per actualitzar-los tots executarem
db.alumnes.updateMany({},{$set: {Matriculat:"SI" }})