Spring中MongoDb出现“排序超过内存限制”的问题

5
我正在编写一个使用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
你能否确定异常是在第一次还是第二次聚合操作中抛出的? - Gonzalo Matheu
我已经更正了这篇文章,只是第一次聚合。 - Pedro Henrique
1个回答

1

您应该启用allowDiskUse选项。

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

来自MongoDB的排序文档:

$sort阶段有100兆字节RAM的限制。默认情况下,如果阶段超过此限制,$sort将产生错误。为了处理大型数据集,将allowDiskUse选项设置为true以启用$sort操作写入临时文件。


1
我已经尝试使用newAggregationOptions().cursorBatchSize(pageable.getPageSize()).allowDiskUse(true).build(),但是出了什么问题?它已经启用了。 - Pedro Henrique

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接