【问题标题】:Map a field in aggregation using Spring Mongo (java)使用 Spring Mongo (java) 在聚合中映射字段
【发布时间】:2019-12-31 17:39:01
【问题描述】:

我正在尝试从一个数组中获取一个属性,该数组在我的文档中有一堆属性,并将结果作为新数组放入

这是一个简单的 map 聚合。我可以使用以下查询在 shell 中使用 mongo 来做到这一点:

db.getCollection('foo').aggregate([ 
  { '$project': { 'newField': { '$map': { input: '$contacts', in: '$$this.email' } } }
])

不过,我无法使用 Spring Mongo 在 Java 中创建它。我检查了文档,发现:https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.aggregation.supported-aggregation-operations

我可以使用该信息和我的 IDE 的帮助来创建它:

AggregationOperation project = Aggregation.project()
   .and(VariableOperators.Map.itemsOf("contacts")
   .as("c")
   .andApply(document -> new Document("newFieldArray", StringOperators.valueOf("c.email")))).as("newField")

但它返回 null 并且除此之外它很难调试。我一直在调试器中看到这个:

"includedDivisions" : { "$map" : { "input" : "$contacts", “as”:“c”,“in”:{“c”:{“$java”: org.springframework.data.mongodb.core.aggregation.StringOperators$StringOperatorFactory@796460bf } } } },

任何帮助将不胜感激

【问题讨论】:

    标签: java mongodb spring-boot


    【解决方案1】:

    Spring-data 不提供对 Query DSL 的完全支持。

    因此,您需要扩展 AggregationOperation 解释 here 并将原始查询设置为 BasicDBObject / Document(取决于您的 MongoDB 版本)。

    AggregationOperation project =
        new GenericAggregationOperation(
           "$project", 
           "{ \"newField\": { \"$map\": { \"input\": \"$contacts\", \"in\": \"$$this.email\" } } }"
    );
    Operations.aggregate(Aggregation.newAggregation(project), ...);
    

    【讨论】:

      猜你喜欢
      • 2015-10-31
      • 2018-06-14
      • 2019-10-14
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多