Det finns inte ett helt enkelt sätt att göra detta i MongoDB. Jag har tagit fram ett alternativ som kan fungera för dig. Om dina datum kommer i diskreta steg, som om detta är för en bokningsapplikation där användare reserverar objekt per dag eller timme, kan du använda en kombination av unika index och multikey-index. Anta till exempel att bokningar sker på dagtid. John Q reserverar 11 oktober till och med 14 oktober. Det är ungefär de 281:a till 284:e dagarna på året - låt oss anta att det är exakt vilka dagar det är. Spara reservationsfältet som en uppsättning av de dagar som är reserverade
> db.reservations.insert({ "span" : [ 281, 282, 283, 284 ] })
Sätt ett unikt index på span
fältet.
> db.reservations.ensureIndex({ "span" : 1}, { "unique" : 1 })
Nu kan du inte infoga ett dokument som har någon av dessa dagar i sitt spann:
> db.reservations.insert({ "span" : [ 279, 280, 281, 282 ] })
// unique key error
Detta kan fungera för dig med några ytterligare justeringar för att ta hänsyn till året, eller så kan det vara en del av ett sammansatt unikt index för att göra tidsperioderna unika genom att t.ex. room_id
för hotellbokning.
Ett annat sätt är att bara samordna kontrollerna på kundsidan. Om du har flera klienter som inte pratar med varandra alls antar jag att det bästa sättet att göra detta är att dela ett "lås" i databasen:findAndModify
ett dokument i ett lock
samling för att kontrollera och skaffa ett lås. När en klient väl har låst genom att ändra ett fält på det dokumentet, kan den göra kontrollen för överlappningar med en fråga och sedan infoga om allt är bra, släpp sedan låset genom att ändra flaggan på låsdokumentet igen.