sql >> Database >  >> NoSQL >> MongoDB

MongoDb unieke beperkingen voor een datumbereik

Er is geen doodeenvoudige manier om dit te doen in MongoDB. Ik heb een alternatieve optie bedacht die voor jou zou kunnen werken. Als uw datums in discrete stappen komen, bijvoorbeeld als dit voor een boekingstoepassing is waarbij gebruikers objecten per dag of per uur reserveren, dan kunt u een combinatie van unieke indexen en multikey-indexen gebruiken. Stel bijvoorbeeld dat reserveringen per dag zijn. John Q reserveert 11 oktober tot en met 14 oktober. Dat is zoiets als de 281e tot 284e dag van het jaar - laten we aannemen dat dat precies de dagen zijn. Sla het reserveringsveld op als een array van de gereserveerde dagen

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

Zet een unieke index op de span veld.

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

U kunt nu geen document invoegen dat een van die dagen in zijn bereik heeft:

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

Dit kan voor u werken met wat extra aanpassingen om rekening te houden met het jaar, of het kan deel uitmaken van een samengestelde unieke index om de tijdspannes uniek te maken door b.v. room_id voor hotelboekingen.

Een andere manier is om de controles gewoon aan de klantzijde te coördineren. Als je meerdere clients hebt die helemaal niet met elkaar praten, denk ik dat je dit het beste kunt doen door een "slot" in de database te delen:findAndModify een document in een lock verzamelen om een ​​slot te controleren en te verkrijgen. Zodra een klant de vergrendeling heeft door een veld op dat document te wijzigen, kan deze controleren op overlappingen met een query en vervolgens de vergrendeling invoegen als alles goed is, en vervolgens de vergrendeling ontgrendelen door de vlag op het vergrendelingsdocument opnieuw te wijzigen.




  1. Diff() tussen twee collecties in MongoDB

  2. waarom kan ik de mongodb niet starten?

  3. Configureer pymongo om string _id te gebruiken in plaats van ObjectId

  4. Ik kan het BSON-type handmatig specificeren in Mongodb's NodeJS Driver? Ik krijg een foutmelding als ik $numberLong gebruik