Spring中``Sort超出内存限制'​​'MongoDb的问题

时间:2019-06-06 12:19:58

标签: java database mongodb spring-boot criteria

我正在编写一种使用MongoRepository实现查询的方法,我在Java / Spring项目中使用了聚合,但是在测试时它提供了超出内存的限制。

我尝试使用

newAggregationOptions().cursorBatchSize(pageable.getPageSize()).allowDiskUse(true).build()

但是没用

我的方法:

...
        var matchCriteria = match(criteria);

        var unwindVariations = unwind("variations", false);


        var sort = sort(Sort.Direction.ASC, "variations.plataformStatus.status");

        var countResult = count().as("totalElements");
        var aggregationOptions = Aggregation.newAggregationOptions().cursorBatchSize(pageable.getPageSize()).allowDiskUse(true).build();

        var countAggregation = newAggregation(
                matchCriteria,
                unwindVariations,
                sort,
                countResult)
                .withOptions(aggregationOptions);

        var totalElements = mongoTemplate.aggregate(countAggregation, "PRODUCT", Map.class).getMappedResults();


错误消息:

com.mongodb.MongoCommandException: Command failed with error 16819 (Location16819): 'Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in.' on server cluster0-shard-00-01-du380.mongodb.net:27017.

1 个答案:

答案 0 :(得分:1)

您应该启用 allowDiskUse 选项。

默认情况下,排序操作的内存上限为100MB(在内存中),启用该选项将允许使用更大的大小。

来自MongoDB's sort documentation

  

$ sort阶段的RAM限制为100 MB。默认情况下,如果阶段超出此限制,则$ sort将产生错误。要允许处理大型数据集,请将allowDiskUse选项设置为true以使$ sort操作能够写入临时文件。