MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Restrições exclusivas do MongoDb em um intervalo de datas


Não existe uma maneira simples de fazer isso no MongoDB. Eu preparei uma opção alternativa que poderia funcionar para você. Se suas datas vêm em etapas discretas, como se for para um aplicativo de reserva em que os usuários reservam objetos por dia ou hora, você pode usar uma combinação de índices exclusivos e índices de várias chaves. Por exemplo, suponha que as reservas sejam por dia. John Q reserva de 11 a 14 de outubro, inclusive. Isso é algo como os 281º a 284º dias do ano - vamos supor que são exatamente esses dias. Salve o campo de reserva como uma matriz dos dias que estão reservados
> db.reservations.insert({ "span" : [ 281, 282, 283, 284 ] })

Coloque um índice exclusivo no span campo.
> db.reservations.ensureIndex({ "span" : 1}, { "unique" : 1 })

Agora você não pode inserir um documento que tenha qualquer um desses dias em seu intervalo:
> db.reservations.insert({ "span" : [ 279, 280, 281, 282 ] })
// unique key error

Isso pode funcionar para você com alguns ajustes adicionais para levar em conta o ano, ou pode ser parte de um índice único composto para tornar os intervalos de tempo únicos, por exemplo, room_id para reserva de hotel.

Outra maneira é apenas coordenar as verificações do lado do cliente. Se você tiver vários clientes que não conversam entre si, acho que a melhor maneira de fazer isso seria compartilhar um "bloqueio" no banco de dados:findAndModify um documento em um lock coleção para verificar e adquirir uma fechadura. Uma vez que um cliente tenha o bloqueio alterando um campo nesse documento, ele pode fazer a verificação de sobreposições com uma consulta e, em seguida, inserir se tudo estiver bem, depois liberar o bloqueio alterando o sinalizador no documento de bloqueio novamente.