Группа данных Mongodb Spring _id toLower или регистр символов - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть запрос фасета и агрегата mongodb при весенней загрузке с использованием шаблона монго и запроса агрегации. все работает нормально, за исключением значения регистра. У меня ниже запрос в mongodb:

db.getCollection('product').aggregate([{"colors":[{$unwind:"$variants"},
{"$group": {
        _id: { $toLower: "$variants.color" },
        count:{$sum:1},
        image : { $first: '$variants.color_image' },
    }}

]

У меня есть эквивалентный запрос данных пружины:

Aggregation.facet(unwind("variants"), group("variants.color").count().as("count").first("variants.color_image").as("image"))
            .as("colors");

Но здесь, как я могу упомянуть toLower to group field? нужна помощь.

1 Ответ

1 голос
/ 02 ноября 2019

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");
...