有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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;

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

谢谢


共 (2) 个答案

  1. # 1 楼答案

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

    所以,你有两个选择:

    • 减少输出的大小,这里的一种可能性是使用Spring Data MongoDB的limit()方法来限制输出的大小
    • 使用MongoDB的$out operator将聚合结果通过管道传输到集合

    您可以通过Spring的Mongo DB的facade(注意:我还没有验证这段代码,但重要的一点是,您必须提供一个AggregationOperation,就像我在下面编写的代码一样):

    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());
    
  2. # 2 楼答案

    我最初标记为正确的答案确实有效,但我找到了一个更简单的答案,索引

    所以对于其他有这个问题的人:

    db。getCollection('myCollectionName')。createIndex({“key”:-1}) (我用机器人来做这个)

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