当前位置: 首页 > 知识库问答 >
问题:

Spring数据排序操作超出最大大小

谢宸
2023-03-14

我是相当新的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);
  • 执行器错误:操作失败:排序操作使用超过最大33554432字节的RAM。添加索引,或指定一个较小的限制。;嵌套异常是com.mongodb.MongoExc0019: Execator错误:操作失败:排序操作使用超过内存的最大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;

我真的不知道如何处理这件事。如果两个查询都在给定的大小限制内,则可以工作。如果任何人有任何提示或建议,将不胜感激。如果你有任何问题或需要任何额外的代码让我知道!

谢谢

共有2个答案

尤俊誉
2023-03-14

答案我原来标记为正确的工作,但我能够找到一个更简单的答案,索引!

因此,对于其他有此问题的人:

db.get集合('myColltionName'). createIndex({"key":-1})(我为此使用robomongo)

所以在我的例子中,关键是vin,因为我想按它排序,-1表示降序,1表示升序。

壤驷兴朝
2023-03-14

聚合管道的结果超过16MB,并且由于MongoDB文档的最大允许大小为16MB,因此引发此异常。

因此,您有两种选择:

  • 减小输出的大小,这里的一种可能是使用Spring Data MongoDB的limit()方法来限制输出的大小

您可以通过Spring的Mongo DB facade将代码调整为使用$out,如下所示(注意:我尚未验证此代码,但重要的一点是,您必须提供一个聚合操作,如下所示):

Aggregation agg = Aggregation.newAggregation(VehicleStatus.class, matchStage, sort, new    AggregationOperation() {
  @Override
  public DBObject toDBObject(AggregationOperationContext context) {
    return new BasicDBObject("$out", “outputCollection”);
  }
}).withOptions(Aggregation.newAggregationOptions().allowDiskUse(true).build());
 类似资料:
  • 本文向大家介绍数据结构中的最大WBLT操作,包括了数据结构中的最大WBLT操作的使用技巧和注意事项,需要的朋友参考一下 在这里,我们将看到什么是不同的Max-WBLT操作。HBLT具有不同的操作,例如插入,删除和初始化。它们也与WBLT非常相似。但是,融合操作可以在一次从上到下的过程中完成。 WBLT可以进行单遍熔合操作。因为我们可以在下降的过程中找到w值。我们可以根据需要更新w值并交换子树。对于

  • 问题内容: 当我运行我的代码时,Node.js引发由过多的递归调用引起的异常。我试图将Node.js堆栈大小增加,但是Node.js崩溃而没有任何错误消息。当我不使用sudo再次运行此命令时,Node.js将输出。是否有可能在不删除递归调用的情况下解决此问题? 问题答案: 您应该将递归函数调用包装到 , 要么 函数使node.js有机会清除堆栈。如果您不这样做,并且有很多循环没有任何 真正的 异步

  • 问题内容: 我想这意味着有一个循环引用,但是对于我的一生,我无法猜测如何解决它。 有人有主意吗? http://plnkr.co/edit/aNcBcU?p=预览 检查Chrome中的调试控制台(例如),您将看到错误。冒犯的行是 通过以下方式在控制器上对scope.map进行“ $ watched” 问题答案: 这是因为您要比较对象是否相等,而不是参考。将您的声明更改为此:

  • 如果用户未登录,我尝试将用户重定向到“TrapPage”。 这是我的代码: 当我将函数requireAuth放在onEnter上时,控制台给我一个错误: 我是一个反应迟钝的人,请耐心点:) 我的代码有什么问题?

  • 我在[17,98,89,42,67,54,89,25,38]中有一个数字列表,从左到右插入到一个空堆中。生成的堆是什么?

  • 我正在使用ReactiveMongoTemplate MongoDB ChangeStream来监听对MongoDB集合的更新,执行一些查询,并将文档持久化到另一个集合。虽然它在本地运行良好,但在部署到容量很大的UAT后,它开始出现以下错误: 解决这个问题的方法是什么? 我的档案里有application.yml 这就是简化更改拖缆的外观: 我知道我可能需要添加一些连池才能处理多个连接?但是我如何