java Spring数据排序操作超出最大大小
我是全新的Spring和Mongodb,在从我的Mongodb中提取数据时遇到了问题。我试图获取大量数据,但收到以下异常:
...
Query query = new Query();
query.with(new Sort(Sort.Direction.DESC, "vin"));
Criteria c = new Criteria().andOperator(Criteria.where("updateTime").gt(startDate),
Criteria.where("updateTime").lte(endDate));
query.addCriteria(c);
return this.mongoOperations.find(query, VehicleStatus.class);
- 执行器错误:操作失败:排序操作使用的RAM超过最大33554432字节。添加索引或指定较小的限制。;嵌套的异常是com。mongodb。MongoException:执行器错误:操作失败:排序操作使用的内存超过最大33554432字节。添加索引,或指定较小的限制强>
在进一步阅读之后,似乎使用聚合是一个好主意,因为我可以允许将磁盘用于临时存储。我认为允许磁盘空间可以解决这个问题,也许我用错了?但是,我现在收到以下错误:聚合结果超过了最大文档大小(16MB)”,“代码”:16389
...
MatchOperation matchStage = Aggregation.match(new Criteria().andOperator(Criteria.where("updateTime").gt(startDate),
Criteria.where("updateTime").lte(endDate)));
SortOperation sort = Aggregation.sort(Direction.DESC, "vin");
Aggregation agg = Aggregation.newAggregation(VehicleStatus.class, matchStage, sort)
.withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).build());
List<VehicleStatus> vs = this.mongoOperations.aggregate(agg, "vehicleStatus", VehicleStatus.class).getMappedResults();
return vs;
我真的不知道该怎么处理。如果两个查询都在给定的大小限制内,则它们都可以工作。如果任何人有任何提示或建议,将不胜感激。如果你有任何问题或需要任何额外的代码让我知道
谢谢
# 1 楼答案
聚合管道的结果超过16MB,并且由于MongoDB文档的最大允许大小为16MB,因此引发此异常
所以,你有两个选择:
limit()
方法来限制输出的大小您可以通过Spring的Mongo DB的facade(注意:我还没有验证这段代码,但重要的一点是,您必须提供一个
AggregationOperation
,就像我在下面编写的代码一样):# 2 楼答案
我最初标记为正确的答案确实有效,但我找到了一个更简单的答案,索引
所以对于其他有这个问题的人:
db。getCollection('myCollectionName')。createIndex({“key”:-1}) (我用机器人来做这个)
所以在我的例子中,关键是vin,因为我想按它排序,-1表示下降,1表示上升