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

MongoDb unikke begrænsninger på et datointerval

Der er ikke en simpel måde at gøre dette på i MongoDB. Jeg lavede en alternativ mulighed, der kunne fungere for dig. Hvis dine datoer kommer i diskrete trin, som hvis dette er til en bookingapplikation, hvor brugere reserverer objekter på dagen eller timen, så kan du bruge en kombination af unikke indekser og multikey-indekser. Antag for eksempel, at reservationer er om dagen. John Q reserverer 11. oktober til 14. oktober inklusive. Det er noget i retning af de 281. til 284. dage i året - lad os antage, at det er præcis, hvilke dage det er. Gem reservationsfeltet som en række af de dage, der er reserveret

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

Sæt et unikt indeks på span felt.

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

Nu kan du ikke indsætte et dokument, der har nogen af ​​disse dage i sit tidsrum:

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

Dette kan fungere for dig med nogle ekstra justeringer for at tage højde for året, eller det kan være en del af et sammensat unikt indeks for at gøre tidsperioderne unikke ved f.eks. room_id til hotelbooking.

En anden måde er blot at koordinere kontrollen på klientsiden. Hvis du har flere klienter, der slet ikke taler til hinanden, gætter jeg på, at den bedste måde at gøre dette på ville være at dele en "lås" i databasen:findAndModify et dokument i en lock samling for at kontrollere og erhverve en lås. Når en klient har låsen ved at ændre et felt på det pågældende dokument, kan den foretage kontrollen for overlapninger med en forespørgsel og derefter indsætte, hvis alt er i orden, og derefter frigive låsen ved at ændre flaget på låsedokumentet igen.




  1. Hvordan ændres datatype af indlejret felt i Mongo-dokument?

  2. Brug af native ES6-løfter med MongoDB

  3. Test tom streng i mongodb og pymongo

  4. $geoNear matchende nærmeste array