3. DML en NoSQL
En aquest apartat veurem les operacions de manipulació de dades (DML): inserir, esborrar i modificar documents en MongoDB. Les operacions de consulta les veurem en l'apartat següent (DQL).
3.1. Consideracions inicials
Consideracions inicials
- En Mongo tot són documents JSON.
- Per tant, tindrem sempre
camp: valor, i els valors sempre entre cometes. - En els elements de Mongo es posarà un
$davant. - En ocasions, quan vulguem accedir a elements dels subdocuments, haurem de posar-los entre cometes i, fins i tot en funcions complexes, amb
$. - Qualsevol element tindrà
{}, i alguns tindran arrays[]. - Totes les operacions comencen per
db, que indica data base, i serà l'última que haurem posat ambuse.
3.2. Operacions bàsiques. CRUD
- INSERIR:
insert/insertOne/insertMany - ESBORRAR:
remove/deleteOne/deleteMany - MODIFICAR:
update/updateOne/updateMany/replaceOne/save - CONSULTAR:
findi les seues variants.
Nota
remove i save estan obsolets en alguns drivers; les versions noves usen delete*, update* i insert*.
3.3. Operacions d'inserció
Tenim 3 mètodes per inserir:
insert(JSON): pots inserir un o diversos documents alhora. Està obsolet en alguns drivers.insertOne(JSON): és la nova versió per a quan només volem inserir 1 document.insertMany([JSON]): és la nova versió per a quan volem inserir més d'1 document.
Sintaxi: db.<col·lecció>.insert(<JSON>)
Tenim dues formes d'inserir:
Per inserir-ne diverses:
| JavaScript | |
|---|---|

Atòmic per document
Recorda que Mongo és atòmic per document: si alguna de les insercions falla, les que s'hagen realitzat abans S'INSEREIXEN!, i no s'inseriran les posteriors a la fallada.
3.4. Operacions de borrat
Per eliminar tenim opcions com en insert:
deleteOne(filtre): sols esborra el primer document que trobe que complisca el filtre.deleteMany(filtre): esborra tots els documents que complisquen el filtre.
| JavaScript | |
|---|---|

Atenció
Si no es posa cap filtre, deleteMany({}) esborra tots els documents de la col·lecció. Vés amb compte!
3.5. Operacions de modificació
db.<col·lecció>.updateOne(filtre, accio, opcions)db.<col·lecció>.updateMany(filtre, accio, opcions)db.<col·lecció>.replaceOne(filtre, canvi, opcions): canvia un document per un altre.
On:
- filtre: és com el
where. - acció: les accions que realitzarem per fer actualitzacions.
- opcions: opcions alternatives que podem configurar per fer coses extres en l'operació.
3.5.1. Accions
Accions d'actualització
$set: defineix la clau que s'actualitzarà (o crearà si no existira). És el més habitual.$inc: incrementa el valor d'un camp numèric.$rename: canvia el nom d'una clau.$unset: elimina la clau del document.$currentDate: actualitza un camp a la data actual.$,$[...],$[<id>]: marques d'elements (per a arrays).$pull: elimina els valors d'un array que complisquen el filtre.$pullAll: elimina els valors especificats d'un array.$pop: elimina el primer o últim valor d'un array.$push: afig un element a un array.$position: s'usa ambpushper indicar la posició exacta on afegir elements.$slice: s'usa ambpushper limitar la grandària final de l'array.$sort: s'usa ambpushper reordenar els elements afegits.$addToSet: afig elements a un array si no existeixen.$each: s'empra amb$addToSeti$pushper permetre l'agregació múltiple d'elements a un array.
Exemple d'update:

Objectes embeguts
Si fem un update d'un document que té un objecte embegut, cal posar totes les dades d'aquest objecte; si no, es perden els camps de l'objecte.
Ací tenim un exemple de com es perd la informació del propietari que no hem modificat:

Exemple d'update amb $inc per augmentar un valor numèric:

Exemple d'update amb $rename, on veiem que es canvia el nom del camp, però es recol·locarà al final del document:

Per suposat, podem canviar el nom del camp en tots els documents; en aquest cas sols un document tenia aquest camp.
Exemple d'update amb $unset, on eliminem un camp d'un document:

3.5.2. Opcions

- No posar cap: recorda que posar opcions és optatiu.
multi: booleà, per defectefalse. L'operació update només modifica el primer document que complisca el where. Si posem aquest booleà atrue, s'actualitzaran tots els documents que ho complisquen (farà com unupdateMany).upsert: booleà, per defectefalse. Si un update no compleix el where, l'operació no fa res; si posem aquest booleà atrue, s'inserirà com un nou document.hint: per forçar que utilitze un índex determinat. Si l'índex que indiquem no existeix, donarà error.
3.5.3. replaceOne
A diferència d'update, que només modifica o afig els elements que posem en l'apartat d'acció, amb replaceOne substituïm el document sencer pel que posem.
Amb aquesta operació, evidentment, només es pot anar d'1 en 1:


