V MongoDB neexistuje jednoduchý způsob, jak to udělat. Uvařil jsem jednu alternativní možnost, která by pro vás mohla fungovat. Pokud vaše data přicházejí v diskrétních krocích, například pokud jde o rezervační aplikaci, kde si uživatelé rezervují objekty na den nebo hodinu, můžete použít kombinaci jedinečných indexů a víceklíčových indexů. Předpokládejme například, že rezervace jsou na den. John Q si vyhrazuje 11. až 14. října včetně. To je něco jako 281. až 284. den v roce – předpokládejme, že to jsou přesně ty dny. Uložte pole rezervace jako pole dnů, které jsou rezervovány
> db.reservations.insert({ "span" : [ 281, 282, 283, 284 ] })
Umístěte jedinečný index na span
pole.
> db.reservations.ensureIndex({ "span" : 1}, { "unique" : 1 })
Nyní nemůžete vložit dokument, který má ve svém rozsahu některý z těchto dnů:
> db.reservations.insert({ "span" : [ 279, 280, 281, 282 ] })
// unique key error
To by vám mohlo fungovat s nějakým dalším vylepšením, které vezme v úvahu rok, nebo to může být součástí složeného jedinečného indexu, aby se časové rozpětí stalo jedinečným, např. room_id
pro rezervaci hotelu.
Dalším způsobem je pouze koordinace kontrol na straně klienta. Pokud máte více klientů, kteří spolu vůbec nemluví, myslím, že nejlepším způsobem, jak to udělat, by bylo sdílet "zámek" v databázi:findAndModify
dokument v lock
kolekce zkontrolovat a získat zámek. Jakmile klient získá zámek změnou pole v tomto dokumentu, může provést kontrolu překrývání pomocí dotazu a poté vložit, pokud je vše v pořádku, a poté zámek uvolnit opětovnou změnou příznaku na dokumentu zámku.