【问题标题】:Faceted classification - Spring Data Mongo分面分类 - Spring Data Mongo
【发布时间】:2019-05-02 21:02:50
【问题描述】:

我正在尝试使用 Spring Data Mongo 构建分面分类,但我对如何使用 Aggregation.facet 方法感到困惑。

当我试图弄清楚这个东西是如何工作的时,我使用了两次相同的FacetOperation,我得到了一个java.lang.IllegalArgumentException: Invalid reference 'producer.fundings'!。这个FacetOperation 单独在Aggregation 工作正常!

FacetOperation fo1 = facet(
        unwind("producer.fundings"),
        project().and("producer.fundings.type").as("type").and("producer.fundings.acronym").as("name"),
        group("name", "type").count().as("count"),
        project("count").and("_id.name").as("name").and("_id.type").as("type").andExclude("_id")
    ).as("fundingAcronymFacet");

    FacetOperation fo2 = facet(
        unwind("producer.fundings"),
        project().and("producer.fundings.type").as("type").and("producer.fundings.acronym").as("name"),
        group("name", "type").count().as("count"),
        project("count").and("_id.name").as("name").and("_id.type").as("type").andExclude("_id")
    ).as("fundingNameFacet");

Aggregation agg = Aggregation.newAggregation(fo1,fo2);
AggregationResults<FacetClassification> groupResults = mongoTemplate.aggregate(agg, "observations", FacetClassification.class);
List<FacetClassification> facet = groupResults.getMappedResults();

所以要么我没有很好地使用 facet 方法,只需要一个调用来创建不同的 facet。这看起来就像它在 MongoDB API 中的实现方式:$facet (aggregation) 或者我需要链接facet 调用来创建我的分类的不同方面,并且需要知道第一次调用后会发生什么以及为什么找不到完全相同的参考。

文档仅提供创建一个方面的示例,在其他地方找不到任何示例:Spring Data Mongo Faceted Classification

相关:Using multiple facets in MongoDB Spring Data

任何帮助将不胜感激!

【问题讨论】:

    标签: java spring mongodb spring-data spring-data-mongodb


    【解决方案1】:

    您可以使用and().as() 方法链接多个方面操作。该示例应如下所示,以在同一聚合操作中创建两个不同的方面:

    FacetOperation fo1 = facet(
            unwind("producer.fundings"),
            project().and("producer.fundings.type").as("type").and("producer.fundings.acronym").as("name"),
            group("name", "type").count().as("count"),
            project("count").and("_id.name").as("name").and("_id.type").as("type").andExclude("_id")
    ).as("fundingAcronymFacet")
            .and(unwind("producer.fundings"),
                    project().and("producer.fundings.type").as("type").and("producer.fundings.acronym").as("name"),
                    group("name", "type").count().as("count"),
                    project("count").and("_id.name").as("name").and("_id.type").as("type").andExclude("_id")
            ).as("fundingNamesFacet"); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-04
      • 2018-11-02
      • 2016-10-01
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2014-06-18
      相关资源
      最近更新 更多