我面临以下问题
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=True
第一个人正在为我工作,但它花了大约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()
给出错误例如
对于“output = dataSetCollection.aggregate(project).useCursor(true)”
groovy.lang.MissingMethodException: No signature of method: com.mongodb.AggregationOutput.useCursor() is applicable for argument types: (java.lang.Boolean) values: [true]
对于“output = dataSetCollection.aggregate(project).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]
对于“output = dataSetCollection.aggregate(project,AggregationOptions.builder() .allowDiskUse(真) .useCursor(真) 。建立()) .useCursor(真)“
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: []
什么都没有用。我出错的地方请帮忙!
谢谢。
答案 0 :(得分:3)
在 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)