微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java / MongoDB-如何实现聚合方法以将结果作为游标返回

我面临以下问题

com.mongodb.CommandFailureException: { "serverUsed" : "127.0.0.1:15847" , "errmsg" : "exception: aggregation result exceeds maximum document size (16MB)" , "code" : 16389 , "ok" : 0.0}

谷歌搜索后,我发现一些解决方法,例如使用以下代码

> {“ $out”:“ temp_colls”);
> useCursor =真

一个正在为我工​​作,但是它花费了大约3-4分钟的太多时间.

所以寻找下面我尝试过的第二种选择

原始代码

dbObjArray = new BasicDBObject[2]
dbObjArray[0]= cruxLevel
dbObjArray[1] = project                                  
List<DBObject> pipeline = Arrays.asList(dbObjArray)
       if (!datasetobject?.isFlat && jsonFor != 'collection-grid') {
    output= dataSetCollection.aggregate(pipeline)
       }else{
            output= dataSetCollection.aggregate(project)
       }
output.results().eachWithIndex{list,index->
dataList.add(output.results()[index])

我在下面尝试过在游标中获取结果.

1.

   // Assuming MongoCollection
   dataSetCollection.aggregate(pipeline).useCursor(true)

您可能还需要告诉它使用服务器上的磁盘空间,而不是全部在内存中完成:

2.

  // Assuming MongoCollection
  dataSetCollection.aggregate(pipeline).useCursor(true).allowdiskUse(true)

如果您使用的是旧版驱动程序(或新版驱动程序中的旧API),则这两个选项将如下所示:

3.

   // Assuming DBCollection
    dataSetCollection.aggregate(pipeline, Aggregationoptions.builder().allowdiskUse(true)
    .useCursor(true)
    .build())
   .useCursor(true)

 output= dataSetCollection.aggregate(project).newAggregationoptions().outputMode(Aggregationoptions.OutputMode.CURSOR).build()

错误为例

对于“输出= dataSetCollection.aggregate(项目).useCursor(true)”

groovy.lang.MissingMethodException: No signature of method: com.mongodb.AggregationOutput.useCursor() is applicable for argument types: (java.lang.Boolean) values: [true]

对于“输出= dataSetCollection.aggregate(项目).useCursor(true).allowdiskUse(true)”

groovy.lang.MissingMethodException: No signature of method: com.mongodb.AggregationOutput.useCursor() is applicable for argument types: (java.lang.Boolean) values: [true]

对于“输出= dataSetCollection.aggregate(project,Aggregationoptions.builder()
    .allowdiskUse(true)
        .useCursor(真实)
        .建立())
    .useCursor(true)”

groovy.lang.MissingPropertyException: No such property: Aggregationoptions for class: com.acumetric.hrat.aggregator.DataimportService

最后一个.

groovy.lang.MissingMethodException: No signature of method: com.mongodb.AggregationOutput.newAggregationoptions() is applicable for argument types: () values: []

什么都没用.我要去哪里了,请帮忙!

谢谢.

解决方法:

在else块下面的代码

def dbObjArray = new BasicDBObject[1]
dbObjArray[0]= project
List<DBObject> flatPipeline = Arrays.asList(dbObjArray)
Aggregationoptions aggregationoptions = Aggregationoptions.builder()
                                    .batchSize(100)
                                    .outputMode(Aggregationoptions.OutputMode.CURSOR)
                                    .allowdiskUse(true)
                                    .build();
def cursor = dataSetCollection.aggregate(flatPipeline,aggregationoptions)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐