Как я могу хранить и искать в больших документах с помощью MongoDB?

Хорошо. Вот проблема схемы/архитектуры БД.

В настоящее время в нашем проекте мы используем 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 из другого, поэтому поиск должен быть выполнен после группировки/объединения документов вместе) + логический выражение может быть ОЧЕНЬ сложным.

Так есть ли какие-то хитрые обходные пути? Если нет, то какие другие БД вы можете предложить для перехода?

С уважением.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
0
0
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, после некоторого времени, потраченного на тестирование различных подходов, я, наконец, остановился на использовании Эластичный поиск, потому что нет возможности выполнить запрошенный поиск через MongoDB за адекватное время.

Другие вопросы по теме