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