Подсчет количества документов с использованием агрегации MongoDB

#spring #mongodb #spring-boot #aggregation-framework #spring-data-mongodb

#spring #mongodb #spring-загрузка #агрегация-фреймворк #spring-data-mongodb

Вопрос:

У меня есть документы mongo примерно как

 {
    "_id": {
              "$oid": "243234"
    },
    "category": ["cat1", "cat2"]
}
 

хотите получить количество всех категорий, (т.е. cat1 = 20, cat2 = 7)
Числа 20 и 7 — это количество документов, в которых список категорий содержит соответствующие элементы.

Попробовал агрегацию в MongoTemplate, из-за чего я не совсем получил требуемый прогнозируемый результат.

Модель проектирования:

 public class CountModel{
    private String category;
    private Integer count;
}
 

Код, который я пробовал:

 GroupOperation categoryGroup = group("category").count().as("categoryCount");

ProjectionOperation projectionToModel = project()
   .andExpression("category").as("category")
   .andExpression("categoryCount").as("count");

Aggregation aggregation = newAggregation(categoryGroup, matchOperation, projectionToModel);

AggregationResults<PIICategoryCount> results = mongoTemplate.aggregate(aggregation,
   "repo_name",
    CountModel.class);
return results.getMappedResults();
 

Ответ №1:

      db.collection.aggregate([ {$unwind:"$category"}   , { $group:{ _id:"$category" , count: { $sum:1}}   } ])
 

Ответ №2:

Спасибо @kiko075 за ответ.

Просто дайте ответ в приемлемой форме spring boot.


 // unwinds the document(have each document for each element in the list)
UnwindOperation unwindOperation = Aggregation.unwind("category");

// groups by the category which was unwound and counted
GroupOperation categoryGroup = Aggregation.group("category").count().as("categoryCount");

ProjectionOperation projectionToModel = project()
                    .andExpression("_id").as("category")         // _id refers to the unwound category (i.e, cat1)
                    .andExpression("categoryCount").as("count");

Aggregation aggregation = Aggregation.newAggregation(unwindOperation, categoryGroup, projectionToModel);

AggregationResults<CountModel> results = mongoTemplate.aggregate(aggregation,
                    "repo_name",
                    CountModel.class);
return results.getMappedResults();