MongoDB Atomare Operationen
MongoDB unterstützt keine Transaktionen, deshalb müssen Sie dies beim Einsatz in Ihrem Projekt beachten. Unabhängig davon, welches Design Sie verwenden, sollten Sie nicht verlangen, dass MongoDB die Datenintegrität garantiert.
MongoDB bietet jedoch viele atomare Operationen, z. B. das Speichern, Ändern, Löschen von Dokumenten usw., die alle atomare Operationen sind.
Eine atomare Operation bedeutet, dass entweder das Dokument in MongoDB gespeichert wird oder nicht; es wird niemals vorkommen, dass ein abgefragtes Dokument nicht vollständig gespeichert ist.
Datenmodell für atomare Operationen
Betrachten Sie das folgende Beispiel mit Bibliotheksbüchern und Ausleihinformationen.
Das Beispiel veranschaulicht, wie sichergestellt wird, dass Felder, die mit atomaren Operationen (update: update) von eingebetteten Feldern im selben Dokument verknüpft sind, synchronisiert werden.
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") } ]
}
Sie können die Methode db.collection.findAndModify() verwenden, um festzustellen, ob ein Buch ausgeliehen werden kann, und um die neuen Ausleihinformationen zu aktualisieren.
Bette die Felder available und checkout in dasselbe Dokument ein, um sicherzustellen, dass diese Felder synchron aktualisiert werden:
db.books.findAndModify ( {
query: {
_id: 123456789,
available: { $gt: 0 }
},
update: {
$inc: { available: -1 },
$push: { checkout: { by: "abc", date: new Date() } }
}
} )
Übliche Befehle für atomare Operationen
$set
Wird verwendet, um einen Schlüssel anzugeben und seinen Schlüsselwert zu aktualisieren; wenn der Schlüssel nicht existiert, wird er erstellt.
{ $set : { field : value } }
$unset
Wird verwendet, um einen Schlüssel zu löschen.
{ $unset : { field : 1} }
$inc
$inc kann Inkrement-/Dekrementoperationen an einem Schlüssel in einem Dokument durchführen, dessen Wert numerisch ist (nur Zahlen, die die Anforderungen erfüllen).
{ $inc : { field : value } }
$push
Verwendung:
{ $push : { field : value } }
Wert an Feld anhängen. Das Feld muss vom Typ Array sein. Wenn das Feld nicht existiert, wird ein neuer Array-Typ hinzugefügt.
$pushAll
Wie $push, außer dass mehrere Werte gleichzeitig an ein Array-Feld angehängt werden können.
{ $pushAll : { field : value_array } }
$pull
Entfernt einen Wert, der gleich value ist, aus dem Array-Feld.
{ $pull : { field : _value } }
$addToSet
Fügt dem Array einen Wert hinzu, aber nur, wenn der Wert noch nicht im Array enthalten ist.
$pop
Entfernt das erste oder letzte Element eines Arrays.
{ $pop : { field : 1 } }
$rename
Ändert den Feldnamen.
{ $rename : { old_field_name : new_field_name } }
$bit
Bit-Operation, Integer-Typ.
{$bit : { field : {and : 5}}}
Offset-Operator.
> 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 } ] }
Andere Erweiterungen