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:
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 }})
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.
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).
db.alumnes.updateOne({Cognoms:"Cateura"},{$set: {Cognoms:"Kateura"}})
db.alumnes.update({},{$set: {Matriculat:"SI" }})
Aquesta instrucció només actualitza UN document.
db.alumnes.updateMany({},{$set: {Matriculat:"SI" }})