我正在使用 Spring data mongoDB 并使用聚合来获取文档。
List<AggregationOperation> operationsList = new ArrayList<AggregationOperation>();
operationsList.add(Aggregation.unwind("calendarEvent"));
operationsList.add(Aggregation.match(criteria));
operationsList.add(getMacroEventProjectionFields());
if (start <= 0) {
start = 1;
}
operationsList.add(Aggregation.skip(start - 1));
if (limit > 0) {
operationsList.add(Aggregation.limit(limit));
}
Aggregation aggregation = Aggregation.newAggregation(operationsList);
AggregationResults<MacroEvent> groupResults = mongoTemplate.aggregate(
aggregation, mongoTemplate.getCollectionName(KALiEvent.class),
MacroEvent.class);
该集合包含数千条记录,直到昨天它都运行良好。但是今天它开始抛出以下异常:
Error [exception: aggregation result exceeds maximum document size (16MB)]
我谷歌了这个问题,发现聚合只能返回等于MongoDB文档大小的结果,即16MB。我为此找到的唯一解决方法是使用 $out 执行以下操作的管道:
获取聚合管道返回的文档并将它们写入指定的集合。 $out 运算符必须是管道中的最后一个阶段。 $out 运算符让聚合框架返回任意大小的结果集。
但是,我只是想不通如何使用 Spring data MongoDB 完成此操作,以及如何在上面粘贴的代码中使用此 $out。
最佳答案
为了避免 16 mb 异常,我创建了自己的 OutOperation 类来执行 mongo $out 管道操作:
package com.myop;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperationContext;
public class OutOperation implements AggregationOperation {
/**
the name of the collection where aggregation data will be stored
*/
private String collectionName;
public OutOperation(String collectionName) {
this.collectionName = collectionName;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return new BasicDBObject("$out", collectionName);
}
}
关于java - Spring Data MongoDB 聚合 $out 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33687487/