#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();