Spring-boot не допускает сложных агрегаций, как вы можете сделать в оболочке. Итак, вы можете применить такой обходной путь .
Давайте изменим ваш фасетный запрос следующим образом (создайте новое поле, в котором мы устанавливаем значение цвета в нижнем регистре):
db.collection.aggregate([
{
$facet: {
"colors": [
{
$unwind: "$variants"
},
{
$addFields: {
"variants.color_lower": {
$toLower: "$variants.color"
}
}
},
{
"$group": {
_id: "$variants.color_lower",
count: {
$sum: 1
},
image: {
$first: "$variants.color_image"
},
}
}
]
}
}
])
MongoPlayground
Теперь Spring-Boot позволяет определять пользовательские AggregationOperation (общее решение: здесь ):
public class LowerAggregationOperation implements AggregationOperation() {
@Override
public List<Document> toPipelineStages(AggregationOperationContext context) {
return Arrays.asList(
new Document("$addFields",
new Document("variants.color_lower",
new Document("$toLower", "$variants.color")))
);
}
}
Теперь вы завершите агрегирование фасетов:
Aggregation.facet(
unwind("variants"),
new LowerAggregationOperation(),
group("variants.color_lower").count().as("count").first("variants.color_image").as("image"))
.as("colors");