Er is geen doodeenvoudige manier om dit te doen in MongoDB. Ik heb een alternatieve optie bedacht die voor jou zou kunnen werken. Als uw datums in discrete stappen komen, bijvoorbeeld als dit voor een boekingstoepassing is waarbij gebruikers objecten per dag of per uur reserveren, dan kunt u een combinatie van unieke indexen en multikey-indexen gebruiken. Stel bijvoorbeeld dat reserveringen per dag zijn. John Q reserveert 11 oktober tot en met 14 oktober. Dat is zoiets als de 281e tot 284e dag van het jaar - laten we aannemen dat dat precies de dagen zijn. Sla het reserveringsveld op als een array van de gereserveerde dagen
> db.reservations.insert({ "span" : [ 281, 282, 283, 284 ] })
Zet een unieke index op de span
veld.
> db.reservations.ensureIndex({ "span" : 1}, { "unique" : 1 })
U kunt nu geen document invoegen dat een van die dagen in zijn bereik heeft:
> db.reservations.insert({ "span" : [ 279, 280, 281, 282 ] })
// unique key error
Dit kan voor u werken met wat extra aanpassingen om rekening te houden met het jaar, of het kan deel uitmaken van een samengestelde unieke index om de tijdspannes uniek te maken door b.v. room_id
voor hotelboekingen.
Een andere manier is om de controles gewoon aan de klantzijde te coördineren. Als je meerdere clients hebt die helemaal niet met elkaar praten, denk ik dat je dit het beste kunt doen door een "slot" in de database te delen:findAndModify
een document in een lock
verzamelen om een slot te controleren en te verkrijgen. Zodra een klant de vergrendeling heeft door een veld op dat document te wijzigen, kan deze controleren op overlappingen met een query en vervolgens de vergrendeling invoegen als alles goed is, en vervolgens de vergrendeling ontgrendelen door de vlag op het vergrendelingsdocument opnieuw te wijzigen.