How to set allowDiskUse:true in spring mongoTemplate
Asked Answered
E

2

5

currently i am using mongoDB in spring as mongoTemplate .

public List<BasicDBObject> getMoviesByName() {
    Aggregation aggregation = newAggregation(unwind("movies"), 
            match(where("movies.language").is("english")), 
            sort(Sort.Direction.DESC, "createDate"),
            group(fields().and("_id", "$_id").and("category", "$category")).push("$movies").as("movies"),
            project(fields().and("category", "$category").and("movies", "$movies")).andExclude("_id"));
    AggregationResults<BasicDBObject> groupResults = mongoTemplate.aggregate(
            aggregation, "movieCollection", BasicDBObject.class);
    return groupResults.getMappedResults();
}

i am getting exception

 com.mongodb.CommandFailureException: { "serverUsed" : "XXX.XXX.XX.XX:27017" , "errmsg" : "exception: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting. Aborting operation. Pass allowDiskUse:true to opt in." , "code" : 16819 , "ok" : 0.0}

I have studied some posts allowDiskUse:true is solution ,i have tried to set true,but no result .please tell me how to set for above code

Ectoblast answered 18/11, 2016 at 14:26 Comment(2)
Have you tried AggregationResults<BasicDBObject> groupResults = mongoTemplate.aggregate( aggregation, "movieCollection", BasicDBObject.class).withOptions(newAggregationOptions().allowDiskUse(true).build()); ?Underwing
i have tried above code but no resultEctoblast
I
6

You can do like below.

MongoClient client = new MongoClient(new ServerAddress("127.0.0.1", 27017));

DB test = client.getDB("test");

DBCollection sample = test.getCollection("sample");

List<DBObject> aggregationQuery = Arrays.<DBObject>asList(
        new BasicDBObject("$sort",new BasicDBObject("score",-1)),
        new BasicDBObject("$limit",1)
);

System.out.println(aggregationQuery);

Cursor aggregateOutput = sample.aggregate(
        aggregationQuery,
        AggregationOptions.builder()
                .allowDiskUse(true)
                .build()
);

//rest of the code

or simply

    Aggregation aggregation = newAggregation(…).
        withOptions(newAggregationOptions().
        allowDiskUse(true).build());
Instantly answered 18/11, 2016 at 16:59 Comment(0)
W
2

You can set aggregation options like

Aggregation aggregation = newAggregation(…).withOptions(Aggregation.newAggregationOptions().
                        allowDiskUse(true).build());
Wylma answered 13/4, 2017 at 8:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.