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.