Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据排序操作超出最大大小_Java_Spring_Mongodb_Spring Data - Fatal编程技术网

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

Java Spring数据排序操作超出最大大小,java,spring,mongodb,spring-data,Java,Spring,Mongodb,Spring Data,我是全新的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),

我是全新的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;
。。。
MatchOperation matchStage=Aggregation.match(新标准().andOperator(标准,其中(“更新时间”).gt(开始日期),
标准。其中(“更新时间”).lte(结束日期));
排序操作排序=聚合.sort(Direction.DESC,“vin”);
聚合agg=聚合.newAggregation(VehicleStatus.class、matchStage、sort)
.withOptions(Aggregation.newAggregationOptions().allowDiskUse(true.build());
List vs=this.mongoOperations.aggregate(agg,“vehicleStatus”,vehicleStatus.class).getMappedResults();
回报vs;
我真的不知道如何处理这个问题。如果两个查询都在给定的大小限制内,那么它们都可以工作。如果任何人有任何提示或建议,将不胜感激。如果您有任何问题或需要任何其他代码,请告诉我


谢谢

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

因此,您有两种选择:

  • 减小输出的大小,这里有一种可能是使用SpringDataMongoDB的
    limit()
    方法来限制输出的大小
  • 使用MongoDB将聚合结果通过管道传输到集合
您可以通过Spring的Mongo DB facade将代码调整为使用
$out
,如下所示(注意:我尚未验证此代码,但重要的一点是,您必须提供一个
聚合操作
,如下所示):


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

因此,您有两种选择:

  • 减小输出的大小,这里有一种可能是使用SpringDataMongoDB的
    limit()
    方法来限制输出的大小
  • 使用MongoDB将聚合结果通过管道传输到集合
您可以通过Spring的Mongo DB facade将代码调整为使用
$out
,如下所示(注意:我尚未验证此代码,但重要的一点是,您必须提供一个
聚合操作
,如下所示):


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

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

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


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

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

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

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


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

这实际上似乎很合理。我唯一的问题是,我是否可以使用与第一个代码块类似的代码查询临时集合?是的,这是个想法。使用$out“允许”您执行查找+排序a然后对$out命令的结果运行一个简单的查询。太棒了,我会试一试。谢谢你的帮助!这看起来非常合理。我唯一的问题是,我是否可以使用与第一个代码块类似的代码来查询临时集合?是的,这就是想法。使用$out“允许”你执行find+sort a然后对$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());