Mongodb Spring数据组_id降低或区分大小写

时间:2019-11-02 09:19:57

标签: mongodb spring-data-jpa mongodb-query aggregation-framework spring-data-mongodb

我在春季启动时使用mongo模板和聚合查询使用了mongodb facet和聚合查询。一切工作正常,除了值的大小写敏感。我在mongodb中有以下查询:

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

]

我有等效的spring数据查询:

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

但是在这里我该如何提及下分组字段?需要帮助。

1 个答案:

答案 0 :(得分:1)

Spring-boot不允许像在shell中那样进行复杂的聚合。因此,您可以应用这样的解决方法

我们以此更改您的方面查询(在其中设置小写颜色值的地方创建新字段):

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(通用解决方案:here):

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