Salta el contingut

DAM - DAW - MP 0484 Bases de Dades

Inserció de documents

A MongoDB, les operacions d'inserció 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.

Si la col·lecció no existeix, la operació d'inserció crearà la col·lecció

Per afegir documents en una col·lecció d'una base de dades MongoDB, utilitzarem el mètode insertOne o insertMany. En versions anteriors teniem el mètode insert.

db.collection.insertOne(
    <document>,
    {
        writeConcern: <document>
    }
)
db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

Quan no especifiquem cap _id, mongoDB en genera un d'automàtic amb un valor del tipus ObjectId.

El paràmetre writeConcern descriu el nivell de reconeixement sol·licitat a MongoDB per a les operacions d'escriptura a un mongoDB autònom, a conjunts de rèpliques o a clústers fragmentats. En clústers fragmentats, les instàncies mongoDB, transmetran el writeConcern als fragments.

En versions anteriors hi havia el mètode insert que englobava el insertOne i el insertMany amb un document simple o un array de documents

insertOne

db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
)

insertMany

db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

Comportament de les insercions

  • Creació de la col·lecció: Si la col·lecció no existeix actualment, les operacions d'inserció crearan la col·lecció.

  • camp _id: A MongoDB, cada document emmagatzemat en una col·lecció requereix un camp _id únic que actua com a clau primària. Si un document inserit omet el camp _id, el controlador MongoDB genera automàticament un ObjectId per al camp _id.

    Això també s'aplica als documents inserits mitjançant operacions d'actualització amb upsert: true.

  • Atomicitat: Totes les operacions d'escriptura a MongoDB són atòmiques a nivell d'un sol document. Per obtenir més informació sobre MongoDB i l'atomicitat, vegeu Atomicitat i transaccions.

Exemples

Hem anat veien diferents exemples en els apartats anteriors per a poder treballar amb les dades.

Veurem, però, el comportament en cas d'error.

Si executem les següents instruccions en el mateix ordre en què estan...

db.products.drop()
db.products.insertMany( [
    { item: "card", qty: 15 },
    { item: "envelope", qty: 20 },
    { item: "stamps" , qty: 30 }
] )
db.products.find()

Veiem que per aquests tres primers registres s'ha creat un _id automàtic del tipus ObjectId.

db.products.insertMany( [
    { _id: 10, item: "large box", qty: 20 },
    { _id: 11, item: "small box", qty: 55 },
    { _id: 12, item: "medium box", qty: 30 }
] )
db.products.find()

Si especifiquem un camp _id, el que preval és el que especifiquem nosaltres.

db.products.insertMany( [
    { _id: 13, item: "envelopes", qty: 60 },
    { _id: 13, item: "stamps", qty: 110 },
    { _id: 14, item: "packing tape", qty: 38 }
] )
db.products.find()

Quan es produeix un error, ja no es continua amb els següents documents ja que se suposa que hi ha un cert ordre i no es pot executar el següent insert si un d'anterior ha fallat. En aquest cas només s'ha inserit el primer document amb _id igual a 13 ja que el següent dóna error i ja no se n'executa cap altre.

db.products.insertMany( [
        { _id: 10, item: "large box", qty: 20 },
        { _id: 11, item: "small box", qty: 55 },
        { _id: 11, item: "medium box", qty: 30 },
        { _id: 12, item: "envelope", qty: 100},
        { _id: 13, item: "stamps", qty: 125 },
        { _id: 13, item: "tape", qty: 20},
        { _id: 14, item: "bubble wrap", qty: 30}
    ],
    { ordered: false }
)
db.products.find()

Si especifiquem { ordered: false }, llavors s'executen tots els insert. Si algun d'ells dona error, s'intentaran executar els següents sense abortar la operació. D'aquesta manera s'ha inserit el darrer document, amb _id igual a 14.

Mètodes addicionals per a insercions

MongoDB permet afegir documents amb altres instruccions: