java - Spring Data MongoDB 聚合 $out 管道

标签 java spring mongodb spring-mvc aggregation-framework

我正在使用 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/

相关文章:

java - 为什么我不能在 for 循环条件中使用数学(减法)?

java - Mybatis分组查询超时

java - 从另一个类访问枚举

java - 隐藏和显示 Sprite 和引擎 Android

java Spring @EnableResourceServer 和 @EnableWebSecurity

java - Spring : how to get multiple datasource with GenericDao?

spring - 使用 JTA 批量插入(EntityManager 不能使用 getTransaction)

30 亿文档的 Mongodb 不同聚合

node.js - Mongoose : finding documents with a specific condition

mongodb - 如何在 mongodb 配置文件中设置授权?