который содержит поля start (время начала действия), и end (время окончания действия). Фишка в том, что эти временные отрезки у разных документов пересекаться НЕ должны. То есть в коллекции не должно быть 2 документа, чье время действия "пересекается", "накладывается" друг на друга. Следовательно, этого нельзя допустить как при вставке нового документа, так и при обновлении временного промежутка у уже существующего.
Можно ли как то это сделать с помощью индексов? Я уже нашел одно решение, с помощью updateOne + upsert, но оно все-таки дает маленькую возможность коллизии (если операции попадут в тайминг выполнения идеально одновременно). Может быть, есть какие-нибудь составные индексы, или индексы по временным отрезкам, специально для этого случая?
посмотри в 5 версию ноды, там что-то с таким типом коллекций (обособлены для работы с хронологическими данными) завезли, мб там и есть что-то для тебя
а в 3-4 не встречал, только на уровне кода. касательно коллизий - тоже проблема с тем, что ты не можешь в 1ночку владеть доступом к базе(
Если у вас не очень большие интервалы и у них небольшая фиксированная гранулярность (несколько часов по 5 минут), то можно сделать массив состоящий из времени начала каждого сегмента интервала (01.01.20 13:40, 01.01.20 13:45 … 01.01.20 14:10) и по этому массиву сделать уникальный индекс Если нет, то через транзакцию: кнутри транзакции проверяете что в необходимый интервал не покрыт другими документами и вставляете новый документ
А разве транзакция убережет меня от того, что может быть создано 2 документа с пересекающимися интервалами, в том случае, если создание этих документов выполнялось ИДЕАЛЬНО одновременно? Ведь тут негде появиться write conflit-у. Точно также в параллельных транзациях я пройдусь по промежуткам уже существующих документов, проверю их, не обнаружу пересечений и сделаю запрос на создания дока с новым промежутком.
Snapshot isolation не даст создать два документа
он блокирует коллекцию на запись?
Обсуждают сегодня