sql >> Base de Datos >  >> NoSQL >> MongoDB

Restricciones únicas de MongoDb en un rango de fechas

No hay una forma sencilla de hacer esto en MongoDB. Preparé una opción alternativa que podría funcionar para ti. Si sus fechas vienen en pasos discretos, como si se trata de una aplicación de reserva en la que los usuarios reservan objetos por día o por hora, entonces puede usar una combinación de índices únicos e índices multiclave. Por ejemplo, supongamos que las reservas son por día. John Q reserva del 11 al 14 de octubre, ambos inclusive. Eso es algo así como los días 281 a 284 del año; supongamos que esos son exactamente los días. Guarde el campo de reserva como una matriz de los días que están reservados

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

Ponga un índice único en el span campo.

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

Ahora no puede insertar un documento que tenga alguno de esos días en su lapso:

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

Esto podría funcionar para usted con algunos ajustes adicionales para tener en cuenta el año, o podría ser parte de un índice único compuesto para hacer que los intervalos de tiempo sean únicos, p. room_id para reserva de hotel.

Otra forma es simplemente coordinar los controles en el lado del cliente. Si tiene varios clientes que no se comunican entre sí, supongo que la mejor manera de hacerlo sería compartir un "bloqueo" en la base de datos:findAndModify un documento en un lock colección para comprobar y adquirir un candado. Una vez que un cliente tiene el bloqueo cambiando un campo en ese documento, puede hacer la verificación de superposiciones con una consulta y luego insertar si todo está bien, luego liberar el bloqueo cambiando la bandera en el documento de bloqueo nuevamente.