How to get Count of aggregation query in spring mongo template
Asked Answered
S

3

7

I'm using spring mongo template to run an agreegation query on mongodb. I'm wondering is there any way to find out the count of aggregation result in spring mongo template?

Here is my Aggregation sample :

Aggregation agg = newAggregation(Class1.class,
            match(criteria),
            group("prop1", "prop2")
            .avg("x").as("averageX")
        );

I just need to know how to get count of this aggregation result in spring mongo template.

Supplicant answered 25/9, 2015 at 15:0 Comment(4)
Yes there is. But there is also no code here to show what you are doing.Burlington
I just have an aggregation using Spring Aggregation Class. i just need to get the result count before getting the result itself.Supplicant
Sounds like you want a "facet" result then, and with paging, like Solr/ElasticSearch. Use two separate queries. It's the correct way to do it. Otherwise just count the number of results. What's the problem with that? Again. Still no code. Clear as mud. Just guessingBurlington
I added the code sample. i can't count the total result because i return only part of result with spring(because of pagination) . so i need a way to count the total result of this aggregation and i don't know how to do so.Supplicant
K
9

My response comes very late but it might help others. To get the count for an aggregation you need to add a new group at the end:

Add at the end of the aggregation -> Aggregation.group().count().as("count") to get the count

Aggregation aggregation = newAggregation(
            Aggregation.match(Criteria.where("x").is(x).and("y").exists(true)),
            Aggregation.group("x", "y"),
            Aggregation.group().count().as("count") 
);

To get the count:

Long.parseLong(results.getMappedResults().get(0).get("count").toString());
Keith answered 19/5, 2017 at 14:44 Comment(0)
A
1

for spring data mongo 2.1.4

if you assume your return class is like this:

class Output{
  Object x;
  Object y;
  /**getter and setter**/
}

you can use this code:

1.Hold grouping data:

AggregationResults<Output> result = 
                mongoTemplate.aggregate(
                        agg ,
                        "YOUR_DOCUMENT",
                        Output.class
                );
int count = result.getMappedResults().size();

2. only get count: (grouping not effect until you use first(...) or last(...) usage after that)

Aggregation agg = Aggregation.newAggregation(
                      match(criteria),
                      count().as("x")/*using x only for mapping count*/
                   );
    AggregationResults<Output> result = 
                    mongoTemplate.aggregate(
                            agg ,
                            "YOUR_DOCUMENT",
                            Output.class
                    );
    int count = result.getMappedResults().get(0).getX().get(0);/**o_O**/
Androus answered 16/7, 2019 at 10:46 Comment(0)
D
0

Below worked for me.

List<AggregationOperation> aggOps = new ArrayList<>();
aggOps.add(Aggregation.match(new Criteria("x").is(x)));
aggOps.add(Aggregation.group().count().as("count"));
Aggregation aggRes = Aggregation.newAggregation(aggOps);
AggregationResults<Map> results = mongoTemplate.aggregate(aggRes, "Collection_name", Map.class);
Long count = Long.parseLong(results.getMappedResults().get(0).get("count").toString());

Count variable above have aggregation documents count.

Degeneration answered 11/7, 2023 at 14:22 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.