Spring - mongodb - aggregation - The 'cursor' option is required

后端 未结 3 463
不知归路
不知归路 2021-01-12 17:26

Executing the following aggregation pipeline:

public void getMostLikedItems () {
        UnwindOperation unwind = Aggregation.unwind(\"favoriteItems\");
             


        
相关标签:
3条回答
  • 2021-01-12 17:47
    'The 'cursor' option is required, except for aggregate with the explain argument'
    

    This type of error raised in spring data when you are using incompatible versions of MongoDB and Spring-data-mongo.

    Though you can get rawResults with explain, cursor arguments.

    Aggregation aggregation = Aggregation.newAggregation(group).withOptions( new AggregationOptions(allowDiskUse, explain, cursor));
    
    //try with .withOptions( new AggregationOptions(true,false,new Document()));
    

    Passing by commented Arguments you will get result in rawResult but it will not be mapped in given outType.class.

    To get mapped result you have to download right dependency of spring-data version according to your MongoDb version.

    EDIT

    I have used Spring version 5.0.3 and Spring-data-mongoDB version 2.0.3 It is working Fine.

    0 讨论(0)
  • 2021-01-12 17:52

    From the docs.

    MongoDB 3.4 deprecates the use of aggregate command without the cursor option, unless the pipeline includes the explain option. When returning aggregation results inline using the aggregate command, specify the cursor option using the default batch size cursor: {} or specify the batch size in the cursor option cursor: { batchSize: }.

    You can pass batchSize with AggregationOptions in Spring Mongo 2.x version

    Aggregation aggregation = newAggregation(unwind, group).withOptions(newAggregationOptions().cursorBatchSize(100).build());
    

    With default batch size

    Aggregation aggregation = newAggregation(unwind, group).withOptions(newAggregationOptions().cursor(new Document()).build());
    
    0 讨论(0)
  • 2021-01-12 17:59

    You can provide outputmode as cursor as providing a cursor is mandatory

    List<DBObject> list = new ArrayList<DBObject>();
    list.add(unwind.toDBObject(Aggregation.DEFAULT_CONTEXT));
    list.add(group.toDBObject(Aggregation.DEFAULT_CONTEXT));
    list.add(sort.toDBObject(Aggregation.DEFAULT_CONTEXT));
    
    DBCollection col = mongoTemplate.getCollection("users");
    
    Cursor cursor = col.aggregate(list, AggregationOptions.builder().allowDiskUse(true).outputMode(OutputMode.CURSOR).build());
    
    List<AggregationResultVO> result = new ArrayList<AggregationResultVO>();
    
    while(cursor.hasNext()) {
         DBObject object = cursor.next();
         result.add(new AggregationResultVO(object.get("aggregationResultId").toString()));
    }
    
    0 讨论(0)
提交回复
热议问题