BadrEddineBen
BadrEddineBen

Reputation: 235

Spring data mongo db count nested objects with a specific condition

I have a document like that:

'subject' : {
'name' :"...."
'facebookPosts':[

 {
 date:"14/02/2017 20:20:03" , // it is a string
 text:"facebook post text here",
 other stuff here  

 }

]

}

and I want to count the facebookPosts within a specific objects that their date field contains e.g "23/07/2016".

Now, I do that by extracting all the documents and count in the client side (spring ) , But I think that's not efficient.

Upvotes: 1

Views: 1932

Answers (1)

alturkovic
alturkovic

Reputation: 1130

You need to aggregate your results.

final Aggregation aggregation = Aggregation.newAggregation(
                    Aggregation.match(Criteria.where("facebookPosts.date").regex(REGEX)),
                    Aggregation.unwind("facebookPosts"),
                    Aggregation.group().count().as("count"));

Regex might not be the best solution, just an example.

unwind will split array into separate elements you can then count.

Create a class that will hold the count, something like:

public class PostCount {
    private Long count;
    // getters, setters
}

And then execute it like this:

AggregationResults<PostCount> postCount = mongoTemplate.aggregate(aggregation, Subject.class, PostCount.class);
long count = postCount.getMappedResults().get(0).getCount();

Upvotes: 2

Related Questions