Ist das verschieben von Dokumenten zwischen den Sammlungen eine gute Methode zur Darstellung von Status-änderungen in MongoDB?
Habe ich zwei Sammlungen, die eine (Eine) mit Elementen verarbeitet werden (relativ klein) und eine (B), mit denen bereits verarbeitet (ziemlich groß, mit extra Ergebnis-Felder).
Elemente eingelesen werden Eine, verarbeitet und speichern()'d zu B, dann remove()'d von Eine.
Die Begründung ist, dass die Indizes können Verschieden sein, über diese, und dass die "incoming" - Kollektion gehalten werden kann, sehr klein und schnell auf diese Weise.
Habe ich in Lauf zwei Probleme mit diesem:
- wenn entweder entfernen() oder save () - time-out oder die andernfalls nicht unter Last, verliere ich die Position komplett, verarbeiten oder zweimal
- wenn beide Versagen, die Nebenwirkungen, die passieren, aber es gibt keine Aufzeichnung, dass
Kann ich umgehen die Doppel-Ausfall-Fall mit findAndModify sperren (nicht notwendig, sonst haben wir ein Prozess-level-lock), aber dann haben wir stale lock Probleme und teilweise Fehler können immer noch passieren. Es gibt keine Möglichkeit, atomar entfernen+speichern, um die verschiedenen Sammlungen, so weit ich erzählen kann (vielleicht gewollt?)
Ist es die Beste Praxis für diese situation?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, das ist by design. MongoDB explizit nicht stellt Verknüpfungen oder Transaktionen. Entfernen + Save ist eine form der Transaktion.
Du hast wirklich zwei low-complexity Optionen hier, sowohl
findAndModify
.Option #1: eine einzige Sammlung
Basierend auf Ihrer Beschreibung, Sie sind im Grunde Gebäude eine Warteschlange mit einigen extra-features. Wenn Sie nutzen Sie eine einzige Sammlung verwenden Sie dann
findAndModify
zum aktualisieren des status der einzelnen Elemente an, wie es verarbeitet wird.Leider bedeutet das, dass Sie diese verlieren: ...dass die "incoming" - Kollektion gehalten werden kann, sehr klein und schnell diese Weise.
Option #2: zwei Sammlungen
Die andere option ist im Grunde eine zwei-Phasen-commit, Nutzung
findAndModify
.Werfen Sie einen Blick auf die Dokumentation für diese hier.
Nachdem ein Element verarbeitet, in Eine legen Sie ein Feld, um zu Kennzeichnen, für die Löschung. Anschließend kopieren Sie das Element über B. Einmal kopiert B Sie können dann entfernen Sie das Element aus Eine.
Ich habe nicht versucht, diese selbst noch nicht, aber das neue Buch 50 Tipps und Tricks für die MongoDB-Entwickler erwähnt, ein paar mal über die Verwendung von cron-jobs (oder-Dienste/Taskplaner) zu bereinigen, Daten wie diese. Sie verlassen konnte, die Dokumente in die Sammlung Ein für die Löschung markiert und ausführen der täglichen Arbeit, um Sie klar aus, wodurch das Allgemeine Ausmaß der ursprünglichen Transaktion.
Von dem, was ich bisher gelernt, ich würde nie verlassen die Datenbank in einen Zustand, wo ich verlasse mich auf die nächsten Datenbank-Aktion Erfolg, es sei denn, es ist die letzten Aktion (journalling wird erneut die Letzte db-Aktion bei der Wiederherstellung). Ich habe zum Beispiel ein drei-Phasen-Registrierung, wo ich einen Benutzer anlegen in CollectionA und fügen Sie dann ein anderes verknüpftes Dokument zu CollectionB. Wenn ich den Benutzer erstellen, die ich einbetten, die details der CollectionB Dokument in CollectionA im Fall der zweiten schreiben schlägt fehl. Später werde ich schreiben, ein Prozess, der entfernt den eingebetteten Daten aus CollectionA, wenn das Dokument in CollectionB existiert
Nicht mit Transaktionen verursacht Schmerzen Punkte wie diese, aber ich denke, in einigen Fällen gibt es neue Wege des Denkens über es. In meinem Fall, die Zeit wird zeigen, wie ich Fortschritte mit meiner app