День добрый. Допустим, у меня есть коллекция документов, каждый из

который содержит поля start (время начала действия), и end (время окончания действия). Фишка в том, что эти временные отрезки у разных документов пересекаться НЕ должны. То есть в коллекции не должно быть 2 документа, чье время действия "пересекается", "накладывается" друг на друга. Следовательно, этого нельзя допустить как при вставке нового документа, так и при обновлении временного промежутка у уже существующего.
Можно ли как то это сделать с помощью индексов? Я уже нашел одно решение, с помощью updateOne + upsert, но оно все-таки дает маленькую возможность коллизии (если операции попадут в тайминг выполнения идеально одновременно). Может быть, есть какие-нибудь составные индексы, или индексы по временным отрезкам, специально для этого случая?

6 ответов

24 просмотра

посмотри в 5 версию ноды, там что-то с таким типом коллекций (обособлены для работы с хронологическими данными) завезли, мб там и есть что-то для тебя

а в 3-4 не встречал, только на уровне кода. касательно коллизий - тоже проблема с тем, что ты не можешь в 1ночку владеть доступом к базе(

Если у вас не очень большие интервалы и у них небольшая фиксированная гранулярность (несколько часов по 5 минут), то можно сделать массив состоящий из времени начала каждого сегмента интервала (01.01.20 13:40, 01.01.20 13:45 … 01.01.20 14:10) и по этому массиву сделать уникальный индекс Если нет, то через транзакцию: кнутри транзакции проверяете что в необходимый интервал не покрыт другими документами и вставляете новый документ

Ilya- Автор вопроса
yopp 💉💉
Если у вас не очень большие интервалы и у них небо...

А разве транзакция убережет меня от того, что может быть создано 2 документа с пересекающимися интервалами, в том случае, если создание этих документов выполнялось ИДЕАЛЬНО одновременно? Ведь тут негде появиться write conflit-у. Точно также в параллельных транзациях я пройдусь по промежуткам уже существующих документов, проверю их, не обнаружу пересечений и сделаю запрос на создания дока с новым промежутком.

Ilya
А разве транзакция убережет меня от того, что може...

Snapshot isolation не даст создать два документа

Ilya- Автор вопроса
yopp 💉💉
Snapshot isolation не даст создать два документа

он блокирует коллекцию на запись?

Похожие вопросы

Обсуждают сегодня

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
1. https://www.kaggle.com/code/ahmadrezagholami2001/housing-estimation-linear-regression 2. https://www.kaggle.com/code/ahmadrezagholami2001/uncovering-quality-in-wines-logis...
Ahmadreza
1
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Карта сайта