Как я могу хранить и искать в больших документах с MongoDB? - PullRequest
0 голосов
/ 08 апреля 2019

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

В настоящее время в нашем проекте мы используем 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 МБ.

Мы пробовали несколько обходных путей (например, разделение документа), но все они включают либо $ group или $ lookup этап агрегации (группировка по id, см. пример ниже), но оба не могут использовать индексы, что делает поиск по нескольким полям ОЧЕНЬ длинным.

{
    "_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]
    }
}

Также мы не можем использовать $ match перед ними, потому что поиск может включать логические операторы (например, field_1 = 'a' && field_c! = 320 , где field_1 из одного документа, а field_c из другого, поэтому поиск должен выполняться после группировки / объединения документов) + логическое выражение может быть ОЧЕНЬ сложным.

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

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...