Es gibt in MongoDB keinen ganz einfachen Weg, dies zu tun. Ich habe mir eine alternative Option ausgedacht, die für Sie funktionieren könnte. Wenn Ihre Daten in diskreten Schritten vorliegen, z. B. bei einer Buchungsanwendung, bei der Benutzer Objekte tage- oder stundenweise reservieren, können Sie eine Kombination aus eindeutigen Indizes und Multikey-Indizes verwenden. Angenommen, die Reservierungen gelten für den Tag. John Q reserviert vom 11. Oktober bis einschließlich 14. Oktober. Das ist so etwas wie der 281. bis 284. Tag des Jahres - nehmen wir mal an, das sind genau diese Tage. Speichern Sie das Reservierungsfeld als Array der reservierten Tage
> db.reservations.insert({ "span" : [ 281, 282, 283, 284 ] })
Setzen Sie einen eindeutigen Index auf span
Feld.
> db.reservations.ensureIndex({ "span" : 1}, { "unique" : 1 })
Jetzt können Sie kein Dokument einfügen, das einen dieser Tage in seiner Spanne enthält:
> db.reservations.insert({ "span" : [ 279, 280, 281, 282 ] })
// unique key error
Dies könnte für Sie mit einigen zusätzlichen Optimierungen funktionieren, um das Jahr zu berücksichtigen, oder es könnte Teil eines zusammengesetzten eindeutigen Index sein, um die Zeitspannen eindeutig zu machen, z. room_id
für die Hotelbuchung.
Eine andere Möglichkeit besteht darin, die Überprüfungen auf der Clientseite einfach zu koordinieren. Wenn Sie mehrere Clients haben, die überhaupt nicht miteinander sprechen, ist der beste Weg, dies zu tun, wahrscheinlich, eine "Sperre" in der Datenbank zu teilen:findAndModify
ein Dokument in einem lock
Sammlung, um eine Sperre zu überprüfen und zu erwerben. Sobald ein Client die Sperre hat, indem er ein Feld in diesem Dokument ändert, kann er mit einer Abfrage auf Überschneidungen prüfen und dann einfügen, wenn alles in Ordnung ist, und dann die Sperre aufheben, indem er das Flag auf dem Sperrdokument erneut ändert.