Выполнить MongoTemplate.aggregate без извлечения строки - PullRequest
1 голос
/ 25 февраля 2020

Я использую драйвер Spring Mon go для выполнения большого агрегирующего оператора mon go, который будет работать в течение определенного периода времени. Этап вывода этой агрегации записывает выходные данные агрегации в новую коллекцию. Ни в коем случае мне не нужно извлекать результаты этой агрегации в память.

Когда я запускаю это при загрузке Spring, JVM не хватает памяти, делая поиск строки, хотя я не использую или храню любой из результатов.

Есть ли способ пропустить извлечение строки, используя MongoTemplate.aggregate?

Пример:

mongoTemplate.aggregate(Aggregation.newAggregation(
   Aggregation.sort(new Sort(new Sort.Order(Sort.Direction.DESC, "createdOn"))),

   Aggregation.group("accountId")
      .first("bal").as("bal")
      .first("timestamp").as("effectiveTimestamp"),

   Aggregation.project("_id", "effectiveTimestamp")
                        .andExpression("trunc(bal * 10000 + 0.5) / 100").as("bal"),

   aggregationOperationContext -> new Document("$addFields", new Document("history",Arrays.asList(historyObj))),

   // Write results out to a new collection - Do not store in memory
   Aggregation.out("newBalance")
).withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).build()),
   "account", Object.class
);

1 Ответ

0 голосов
/ 26 февраля 2020

Мне удалось решить эту проблему с помощью

MongoTempalte.aggregateStream(...).withOptions(Aggregation.newAggregationOptions().cursorBatchSize(0).build)
...