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

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

6 ответов

14 просмотров

посмотри в 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 не даст создать два документа

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

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

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

Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
с помощью чего можно бота добавить как админа в чат? (условно в боте есть кнопка, нажатие на которую приводит тебя к выбору чата и выдаче прав боту)
ηє νєямσяє
5
'frakturBold' => ['𝖆', '𝖇', '𝖈', '𝖉', '𝖊', '𝖋', '𝖌', '𝖍', '𝖎', '𝖏', '𝖐', '𝖑', '𝖒', '𝖓', '𝖔', '𝖕', '𝖖', '𝖗', '𝖘', '𝖙', '𝖚', '𝖛', '𝖜', '𝖝', '𝖞', '𝖟', '𝕬', '𝕭', '𝕮', '𝕯'...
Roma
4
Ты просто гитлеровскую эстетику плохо понимаешь. Он же всё под Цезаря делал. А это как бы запрещённый приём в политике. Пиджаки они зачем все носят? Чтобы показать что они тип...
Ivan Kropotkin
4
Добрый день, не подскажите, если в OC-V3 поменять страндартную директорию /storage/ на /storage2/ - не будет сильно много проблем ?
Max Dubovsky
32
Всем привет, есть таблица компонентов (например материнка, процессор, видеокарта и тд) components и нужно еще реализовать механизм "совместимости" (те какой-то словарь, мол од...
Vladimir
2
Добрый день, подскажите как правильно сделать filter в backend-e. Есть модель (товар) у который связь belongsToMany (компания), компаний > 4k, поэтому выборку типа ->all(); н...
Max Dubovsky
7
А цены чем оправданы?
Lencore
7
Hello, I want to ask. I trained EfficientNet V2 Small and achieved 98% accuracy and F1 score on test data. I did the same with a simple CNN and achieved 97% accuracy and F1 sc...
~
2
напомните, как заменить placeholder , а не добавить содержимое ?
Artem N
4
Карта сайта