Хорошо. Вот проблема схемы/архитектуры БД.
В настоящее время в нашем проекте мы используем MongoDB. У нас есть одна БД с одной коллекцией. Всего в этой коллекции почти 4 миллиарда документов (значение постоянное). Каждый документ имеет уникальный идентификатор, и существует много различной информации, связанной с этим идентификатором (поэтому была выбрана MongoDB — данные совершенно разные, поэтому идеально подходит бессхемный вариант).
{
"_id": ObjectID("5c619e81aeeb3aa0163acf02"),
"our_id": 1552322211,
"field_1": "Here is some information",
"field_a": 133,
"field_с": 561232,
"field_b": {
"field_0": 1,
"field_z": [45, 11, 36]
}
}
Целью этой коллекции является хранение большого количества данных, которые легко обновлять (некоторые данные обновляются каждый день, некоторые обновляются раз в месяц) и выполнять поиск по различным полям для получения идентификатора. Также мы храним «историю» каждого поля (и у нас также должна быть возможность поиска по истории). Поэтому, когда были включены сверхурочные обновления, мы столкнулись с проблемой, называемой максимальным размером документа MongoDB 16 МБ.
Мы пробовали несколько обходных путей (например, разбиение документа), но все они включают этап агрегирования либо $ группа, либо $ поиск (группировка по идентификатору, см. пример ниже), но оба не могут использовать индексы, что делает поиск по нескольким полям ЧРЕЗВЫЧАЙНЫМ. длинная.
{
"_id": ObjectID("5c619e81aeeb3aa0163acd12"),
"our_id": 1552322211,
"field_1": "Here is some information",
"field_a": 133
}
{
"_id": ObjectID("5c619e81aeeb3aa0163acd11"),
"our_id": 1552322211,
"field_с": 561232,
"field_b": {
"field_0": 1,
"field_z": [45, 11, 36]
}
}
Также мы не можем использовать стадию $матч перед ними, потому что поиск может включать логические операторы (например, field_1 = 'а' && field_c != 320, где поле_1 из одного документа, а field_c из другого, поэтому поиск должен быть выполнен после группировки/объединения документов вместе) + логический выражение может быть ОЧЕНЬ сложным.
Так есть ли какие-то хитрые обходные пути? Если нет, то какие другие БД вы можете предложить для перехода?
С уважением.
Итак, после некоторого времени, потраченного на тестирование различных подходов, я, наконец, остановился на использовании Эластичный поиск, потому что нет возможности выполнить запрошенный поиск через MongoDB за адекватное время.