MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Contraintes uniques MongoDb sur une plage de dates

Il n'y a pas de moyen simple de le faire dans MongoDB. J'ai concocté une option alternative qui pourrait fonctionner pour vous. Si vos dates se présentent par étapes discrètes, comme s'il s'agit d'une application de réservation où les utilisateurs réservent des objets à la journée ou à l'heure, vous pouvez utiliser une combinaison d'index uniques et d'index multi-clés. Par exemple, supposons que les réservations se font par jour. John Q se réserve du 11 octobre au 14 octobre inclusivement. C'est quelque chose comme les 281e à 284e jours de l'année - supposons que c'est exactement de quel jour il s'agit. Enregistrez le champ de réservation sous la forme d'un tableau des jours réservés

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

Mettre un index unique sur le span champ.

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

Désormais, vous ne pouvez plus insérer un document contenant l'un de ces jours :

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

Cela peut fonctionner pour vous avec quelques ajustements supplémentaires pour prendre en compte l'année, ou cela peut faire partie d'un index unique composé pour rendre les périodes uniques, par exemple. room_id pour la réservation d'hôtel.

Une autre façon consiste simplement à coordonner les vérifications côté client. Si vous avez plusieurs clients qui ne se parlent pas du tout, je suppose que la meilleure façon de procéder serait de partager un "verrou" dans la base de données :findAndModify un document dans un lock collection pour vérifier et acquérir une serrure. Une fois qu'un client a le verrou en modifiant un champ sur ce document, il peut vérifier les chevauchements avec une requête, puis l'insérer si tout va bien, puis libérer le verrou en modifiant à nouveau l'indicateur sur le document verrouillé.