Необходимо создать составной индекс или составной первичный ключ , который включает поля id_user
и start_date
. Это обеспечит невозможность создания документов для одного и того же пользователя с одинаковой датой, и база данных выдаст ошибку, если вы попытаетесь это сделать. Составной индекс с мангустом
Вы также можете использовать транзакций . Для этого необходимо выполнить методы find
и create
внутри транзакции, чтобы гарантировать, что никакие параллельные запросы к одному и тому же документу не будут выполнены. Учебное пособие по транзакциям Mongoose
Я хотел бы воспользоваться уникальным составным индексом, который в вашем конкретном случае должен выглядеть примерно так
mySchema.index({user_id: 1, start_date: 1}, {unique: true});
Хорошо, я адаптировал ответ @Richard:
public static int transferAsMuchAsPossible(
ByteBuffer bbuf_dest, ByteBuffer bbuf_src)
{
int nTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
if (nTransfer > 0)
{
bbuf_dest.put(bbuf_src.array(),
bbuf_src.arrayOffset()+bbuf_src.position(),
nTransfer);
bbuf_src.position(bbuf_src.position()+nTransfer);
}
return nTransfer;
}
и тест для проверки это работает:
public static boolean transferTest()
{
ByteBuffer bb1 = ByteBuffer.allocate(256);
ByteBuffer bb2 = ByteBuffer.allocate(50);
for (int i = 0; i < 100; ++i)
{
bb1.put((byte)i);
}
bb1.flip();
bb1.position(5);
ByteBuffer bb1a = bb1.slice();
bb1a.position(2);
// bb3 includes the 5-100 range
bb2.put((byte)77);
// something to see this works when bb2 isn't empty
int n = transferAsMuchAsPossible(bb2, bb1a);
boolean itWorked = (n == 49);
if (bb1a.position() != 51)
itWorked = false;
if (bb2.position() != 50)
itWorked = false;
bb2.rewind();
if (bb2.get() != 77)
itWorked = false;
for (int i = 0; i < 49; ++i)
{
if (bb2.get() != i+7)
{
itWorked = false;
break;
}
}
return itWorked;
}
Вы получаете BufferOverflowException, потому что Ваш bbuf_dest не является достаточно большим.
Необходимо будет использовать bbuf_dest.remaining () для обнаружения максимального количества байтов, которые можно передать от bbuf_src:
int maxTransfer = Math.min(bbuf_dest.remaining(), bbuf_src.remaining());
bbuf_dest.put(bbuf_src.array(), 0, maxTransfer);