Возможно, вы уже знаете, что MongoDB - это база данных документов, которая обеспечивает высокую доступность, высокую производительность и простую масштабируемость, и она привлекла огромное внимание своим распределенным хранилищем значений ключей, возможностями вычислений MapReduce и т. Д. Таким образом, благодаря своим функциям MongoDB является база данных для обработки больших данных. Но знаете ли вы один важный факт о MongoDB? Согласно MongoDB BL

Максимальный размер документа BSON составляет 16 мегабайт.

Ограничение размера должно гарантировать, что один документ не может использовать чрезмерный объем ОЗУ или во время передачи чрезмерный объем полосы пропускания. Это означает, что даже если ваше приложение работает на машине с размером ОЗУ 16 или 32 ГБ, MongoDB позволит вам хранить или передавать только 16 МБ данных на коллекцию. Для некоторых приложений достичь этого ограничения в 16 МБ очень легко в нынешнюю эпоху больших данных.

В этой статье я собираюсь показать подход к тому, как мы можем обрабатывать эти большие данные с помощью Java?

Один из распространенных логических подходов для решения такой проблемы с памятью - это обработка больших данных порциями с использованием функций Пропустить и Ограничить в MongoDB. Теперь, чтобы обрабатывать эти данные по частям, я черпал вдохновение из модели разбиения на страницы, давайте рассмотрим подход, шаг за шагом.

Шаг 1. Определите размер партии.

В зависимости от размера документов в коллекции определите и зафиксируйте приблизительное количество документов или записей, которые вы хотите обработать в одном пакете. Например, допустим, 1000 записей на пакет. Здесь размер также может обозначаться как количество полей в каждом документе.

private static final int PER_BATCH_COUNT = 1000;

Шаг 2. Рассчитайте количество пакетов или итераций.

Нам нужно рассчитать количество пакетов или итераций, которые необходимо выполнить. Чтобы вычислить это, нам нужно подсчитать общее количество записей, которые должны быть обработаны во время выполнения. Используйте .count (), чтобы получить общее количество.

 db.collection.find(query).count()

Как только вы получите количество, используйте приведенную ниже формулу для расчета количества партий.

int iterations = BigDecimal.valueOf(count).divide(BigDecimal.valueOf(PER_BATCH_COUNT), RoundingMode.UP).intValue();

Здесь мы использовали BigDecimal, потому что нам нужно также учитывать дробную часть деления. Проще говоря, если total_count / PER_BATCH_COUNT дает десятичное число, то плюс 1 итерация.

Шаг 3. Определите начальный индекс для каждой партии.

Теперь нам нужно определить начальный индекс для каждого пакета, который представляет собой не что иное, как атрибут Skip запроса mongo. Чтобы получить начальный индекс каждой итерации, нам нужна одна переменная типа int для хранения текущего номера итерации. Тогда следующая формула даст начальный индекс для каждой итерации.

int startIndex = (iterationNo-1)*PER_BATCH_COUNT+1;

Шаг 4. Выполните цикл, чтобы получить данные из БД

Последний шаг - пройти цикл для получения данных из БД. Ниже приведен последний метод.

private static final int PER_BATCH_COUNT = 1000;
private List<Object> processDataInBatch() {
List<Object> dataList = new ArrayList<Object>();
int count = //Query to get the total number of records
int iterations = BigDecimal.valueOf(count).divide(BigDecimal.valueOf(PER_BATCH_COUNT), RoundingMode.UP).intValue();
int iterationNo = 0; /*this works as a page no, to calcualte the    next start index*/
int rowCount = 1;
while(iterations != 0) {
    iterationNo++;
    int startIndex = (iterationNo-1)*PER_BATCH_COUNT+1;
    Query query = createFilterQuery();
    query.skip(startIndex);
    query.limit(PER_BATCH_COUNT);
    
    dataList.addAll(getMongoTemplate().find( query, Object.class));
    iterations- -;
}
return dataList;
}

Заключение

Согласно MongoDB, этот предел в 16 МБ предназначен для лучшего проектирования схемы, и этот предел всегда будет там. Он может увеличиться, но не будет удален. Вы можете прочитать об этом здесь". Так что лично я считаю, что Mongo должна быть полезна для больших данных и не должна иметь таких ограничений.