Няма прост начин да направите това в MongoDB. Сготвих една алтернативна опция, която може да ви свърши работа. Ако вашите дати идват на отделни стъпки, например ако това е за приложение за резервация, където потребителите резервират обекти по ден или час, тогава можете да използвате комбинация от уникални индекси и индекси с множество ключове. Да предположим например, че резервациите са през деня. John Q запазва от 11 октомври до 14 октомври включително. Това е нещо като 281-ия до 284-ия ден от годината - да приемем, че точно това са дните. Запазете полето за резервация като масив от дните, които са резервирани
> db.reservations.insert({ "span" : [ 281, 282, 283, 284 ] })
Поставете уникален индекс на span
поле.
> db.reservations.ensureIndex({ "span" : 1}, { "unique" : 1 })
Сега не можете да вмъкнете документ, който има някой от тези дни в своя диапазон:
> db.reservations.insert({ "span" : [ 279, 280, 281, 282 ] })
// unique key error
Това може да ви свърши работа с някои допълнителни настройки, за да вземете предвид годината, или може да е част от съставен уникален индекс, за да направите времевите интервали уникални чрез напр. room_id
за хотелска резервация.
Друг начин е просто да координирате проверките от страна на клиента. Ако имате множество клиенти, които изобщо не си говорят, предполагам, че най-добрият начин да направите това е да споделите „заключване“ в базата данни:findAndModify
документ в lock
колекция за проверка и получаване на заключване. След като клиентът получи ключалката, като промени поле в този документ, той може да направи проверка за припокривания със заявка и след това да вмъкне, ако всичко е наред, след което да освободи ключалката, като промени отново флага на заключващия документ.