sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDb unika begränsningar på ett datumintervall

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.




  1. Hur sorterar MongoDB poster när ingen sorteringsordning är angiven?

  2. mongodb query underuppsättning av en array

  3. Redis ERR okänt kommando 'FLUSHDB'

  4. $redis global variabel med rubin på skenor