Граненая классификация - Spring Data Mongo - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь построить граненую классификацию, используя 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();

Так что либо я не очень хорошо использую метод фасетов, и для создания другого фасета требуется только один вызов.Это будет выглядеть примерно так, как это реализовано в MongoDB API: $ facet (агрегат) Или мне нужно связать facet вызов для создания различных аспектов моей классификации и узнать, что происходит после первогоcall и почему точно такая же ссылка не найдена.

Документация содержит только примеры, которые создают один аспект и не могут найти другой пример в другом месте: Spring Data Mongo Faceted Classification .

относится к: Использование нескольких аспектов в данных Spring MongoDB

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 03 декабря 2018

Вы можете объединить несколько операций с фасетами, используя методы 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"); 
...