MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Vincoli univoci di MongoDb su un intervallo di date

Non esiste un modo semplice per farlo in MongoDB. Ho escogitato un'opzione alternativa che potrebbe funzionare per te. Se le tue date arrivano in passaggi discreti, ad esempio per un'applicazione di prenotazione in cui gli utenti prenotano oggetti in base al giorno o all'ora, puoi utilizzare una combinazione di indici univoci e indici multichiave. Ad esempio, supponiamo che le prenotazioni siano giornaliere. John Q si riserva dall'11 ottobre al 14 ottobre inclusi. Questo è qualcosa come il 281° al 284° giorno dell'anno - supponiamo che siano esattamente i giorni in cui sono. Salva il campo della prenotazione come un array dei giorni prenotati

> db.reservations.insert({ "span" : [ 281, 282, 283, 284 ] })

Inserisci un indice univoco su span campo.

> db.reservations.ensureIndex({ "span" : 1}, { "unique" : 1 })

Ora non puoi inserire un documento che abbia uno di quei giorni nel suo intervallo:

> db.reservations.insert({ "span" : [ 279, 280, 281, 282 ] })
// unique key error

Questo potrebbe funzionare per te con alcune modifiche aggiuntive per tenere conto dell'anno, oppure potrebbe essere parte di un indice univoco composto per rendere unici gli intervalli di tempo, ad es. room_id per la prenotazione dell'hotel.

Un altro modo è solo quello di coordinare i controlli lato cliente. Se hai più clienti che non parlano affatto tra loro, immagino che il modo migliore per farlo sia condividere un "blocco" nel database:findAndModify un documento in un lock collezione per controllare e acquisire un lucchetto. Una volta che un client ha il blocco modificando un campo su quel documento, può eseguire il controllo delle sovrapposizioni con una query e quindi l'inserimento se tutto va bene, quindi rilasciare il blocco modificando nuovamente il flag sul documento di blocco.