Ich bin mir bewusst, dass MongoDB kann atomare Updates mit findOneAndModify
tun, aber dies erlaubt nur grundlegende Operationen wie Set oder Inkrement.Wie führe ich eine atomare benutzerdefinierte Aktualisierung eines Mongodb-Dokuments durch?
Was ich brauche, ist eine benutzerdefinierte Funktion anzuwenden mein Dokument zu transformieren:
const updateDoc = async (event) => {
const oldState = await db.collection(collectionName).findOne({ name });
const newState = customFunction(oldState, event);
await db.collection(collectionName).replaceOne({ name }, newState);
}
Diese Funktion wird durch ein System aufgerufen werden, die für einen aufgelösten Versprechen warten nicht weiter zu arbeiten: es können mehrere sein synchrone Anrufe.
Gibt es eine Möglichkeit updateDoc
neu zu schreiben, um es atomar zu machen, so dass, wenn wir das tun:
updateDoc(event1); // note the absence of await
updateDoc(event2);
Wir können sicher sein, dass die gespeicherte doc customFunction(customFunction(initState, event1), event2)
sein wird?
Dank
Wenn Sie befürchten, dass 'oldState 'ist etwas, das Sie entscheiden, Ihr' newState' on aber 'oldState' ist möglicherweise nicht das, was derzeit in der Datenbank ist, wenn Sie' newState' schreiben (es kann eigentlich nicht sein, was in der Datenbank ist, wenn Sie Ihre Entscheidung treffen). Das vielleicht Folgende könnte helfen: http://www.dagolden.com/index.php/2633/no-more-dirty-reads-with-mongodb/ Abhängig davon, wie groß Sie skalieren müssen, können Sie CQRS mit machen ein Ereignisspeicher (Sie aktualisieren niemals Ereignisse, sondern verwenden sie, um den aktuellen Status zu berechnen, und die Daten sind schließlich konsistent). – HMR
Danke. Ich mache eigentlich CQRS + Event Store, ich habe Projektionen gelesen, die in mongodb gespeichert sind und bei neuen Ereignissen neu geschrieben werden, diese Frage betrifft diese Projektionen :) –