Operaciones atómicas de MongoDB

mongodb no admite transacciones, por lo que al aplicarlo en tu proyecto, debes prestar atención a esto. Sea cual sea el diseño, no exijas que mongodb garantice la integridad de los datos.

Pero mongodb ofrece muchas operaciones atómicas, como guardar, modificar y eliminar documentos; todas son operaciones atómicas.

La llamada operación atómica significa que o el documento se guarda en Mongodb o no se guarda; no ocurrirá que un documento consultado no se haya guardado por completo.


Modelo de datos de operaciones atómicas

Considera el siguiente ejemplo: los libros de una biblioteca y la información de préstamo.

El ejemplo ilustra cómo asegurar que los campos incrustados asociados con operaciones atómicas (update: actualización) en un mismo documento se mantengan sincronizados.

book = {
          _id: 123456789,
          title: "MongoDB: The Definitive Guide",
          author: [ "Kristina Chodorow", "Mike Dirolf" ],
          published_date: ISODate("2010-09-24"),
          pages: 216,
          language: "English",
          publisher_id: "oreilly",
          available: 3,
          checkout: [ { by: "joe", date: ISODate("2012-10-15") } ]
        }

Puedes usar el método db.collection.findAndModify() para determinar si el libro está disponible para préstamo y actualizar la nueva información de préstamo.

Los campos available y checkout incrustados en el mismo documento aseguran que estos campos se actualicen sincronizadamente:

db.books.findAndModify ( {
   query: {
            _id: 123456789,
            available: { $gt: 0 }
          },
   update: {
             $inc: { available: -1 },
             $push: { checkout: { by: "abc", date: new Date() } }
           }
} )

Comandos comunes para operaciones atómicas

$set

Se usa para especificar una clave y actualizar su valor; si la clave no existe, se crea.

{ $set : { field : value } }

$unset

Se usa para eliminar una clave.

{ $unset : { field : 1} }

$inc

$inc puede realizar operaciones de incremento/decremento sobre una clave cuyo valor sea numérico (solo números que cumplan el requisito) en un documento.

{ $inc : { field : value } }

$push

Uso:

{ $push : { field : value } }

Agrega value al final de field; field debe ser de tipo array. Si field no existe, se añade un nuevo array.

$pushAll

Igual que $push, solo que puede agregar múltiples valores a la vez a un campo de tipo array.

{ $pushAll : { field : value_array } }

$pull

Elimina de un array field un elemento igual al valor value.

{ $pull : { field : _value } }

$addToSet

Añade un valor al array, pero solo lo añade si ese valor no está ya en el array.

$pop

Elimina el primer o el último elemento de un array.

{ $pop : { field : 1 } }

$rename

Modifica el nombre de un campo.

{ $rename : { old_field_name : new_field_name } }

$bit

Operaciones de bits, tipo integer.

{$bit : { field : {and : 5}}}

Operador de desplazamiento.

> t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }
 
> t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )
 
> t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }
Otras extensiones