Salta el contingut

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 amb use.

3.2. Operacions bàsiques. CRUD

  • INSERIR: insert / insertOne / insertMany
  • ESBORRAR: remove / deleteOne / deleteMany
  • MODIFICAR: update / updateOne / updateMany / replaceOne / save
  • CONSULTAR: find i 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:

JavaScript
var document = { nom: "Pep", edat: 30 };
db.usuaris.insert(document);

Inserció amb variable

JavaScript
db.usuaris.insert({ nom: "Pep", edat: 30 });

Inserció directa

Per inserir-ne diverses:

JavaScript
db.<col·lecció>.insertMany([{document1},{document2}...])

insertMany

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
db.<col·lecció>.deleteOne({ camp: "valor" });
db.<col·lecció>.deleteMany({ camp: "valor" });

deleteMany

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 amb push per indicar la posició exacta on afegir elements.
  • $slice: s'usa amb push per limitar la grandària final de l'array.
  • $sort: s'usa amb push per reordenar els elements afegits.
  • $addToSet: afig elements a un array si no existeixen.
  • $each: s'empra amb $addToSet i $push per permetre l'agregació múltiple d'elements a un array.

Exemple d'update:

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:

Pèrdua d'informació en update

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

Update amb $inc

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

Update amb $rename

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:

Update amb $unset

3.5.2. Opcions

Opcions de l'update

  • No posar cap: recorda que posar opcions és optatiu.
  • multi: booleà, per defecte false. L'operació update només modifica el primer document que complisca el where. Si posem aquest booleà a true, s'actualitzaran tots els documents que ho complisquen (farà com un updateMany).
  • upsert: booleà, per defecte false. Si un update no compleix el where, l'operació no fa res; si posem aquest booleà a true, 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:

replaceOne