Nie ma śmiertelnie prostego sposobu na zrobienie tego w MongoDB. Wymyśliłem jedną alternatywną opcję, która może dla ciebie zadziałać. Jeśli daty są dyskretne, na przykład w przypadku aplikacji do rezerwacji, w której użytkownicy rezerwują obiekty według dnia lub godziny, możesz użyć kombinacji unikalnych indeksów i indeksów wielokluczowych. Załóżmy na przykład, że rezerwacje są na dzień. John Q rezerwuje od 11 do 14 października włącznie. To jest coś w stylu 281 do 284 dni w roku – załóżmy, że to dokładnie te dni. Zapisz pole rezerwacji jako tablicę zarezerwowanych dni
> db.reservations.insert({ "span" : [ 281, 282, 283, 284 ] })
Umieść unikalny indeks na span
pole.
> db.reservations.ensureIndex({ "span" : 1}, { "unique" : 1 })
Teraz nie możesz wstawić dokumentu, który obejmuje którykolwiek z tych dni:
> db.reservations.insert({ "span" : [ 279, 280, 281, 282 ] })
// unique key error
Może to zadziałać z dodatkowymi poprawkami, aby uwzględnić rok, lub może być częścią złożonego unikalnego indeksu, aby przedziały czasowe były unikalne, np. room_id
do rezerwacji hotelu.
Innym sposobem jest po prostu koordynacja kontroli po stronie klienta. Jeśli masz wielu klientów, którzy w ogóle się ze sobą nie komunikują, myślę, że najlepszym sposobem, aby to zrobić, byłoby udostępnienie „blokady” w bazie danych:findAndModify
dokument w lock
kolekcja, aby sprawdzić i zdobyć zamek. Gdy klient ma blokadę, zmieniając pole w tym dokumencie, może sprawdzić, czy pokrywa się z zapytaniem, a następnie wstawić, jeśli wszystko jest w porządku, a następnie zwolnić blokadę, zmieniając ponownie flagę w dokumencie blokady.