Spring Data Mongo - проблема с использованием Aggregation.group () и Aggregation.facet () в поле массива - PullRequest
0 голосов
/ 14 января 2019

Я использую следующий конвейер агрегации и у меня странное поведение в Spring Data Mongodb. Агрегация идет хорошо до стадии facet, которая вызывает исключение Invalid reference 'producer.fundings.type'!.

Fields fieldsToBeGroupedTest = Fields.fields()
        .and("producerId", "producer.producerId")
        .and("name", "producer.name")
        .and("fundings", "producer.fundings");
GroupOperation groupOperationTest = group(fieldsToBeGroupedTest);

Результат проецируется в соответствии с

ProjectionOperation projectionOperationTest = project()
        .and("_id.producerId").as("producer.producerId")
        .and("_id.name").as("producer.name")
        .and("_id.fundings").as("producer.fundings")
        .andExclude("_id");

Из журнала DEBUG следующая база данных выполняется базой данных

[{
    "$group": {
        "_id": {
            "producerId": "$producer.producerId",
            "name": "$producer.name",
            "fundings": "$producer.fundings"
        }
    }
}, {
    "$project": {
        "producer.producerId": "$_id.producerId",
        "producer.name": "$_id.name",
        "producer.fundings": "$_id.fundings",
        "_id": 0
    }
}]

Несколько документов со следующей схемой возвращаются при выполнении этого агрегирования в MongoShell:

{
    "producer": {
        "producerId": "CRYO",
        "name": [{
            "lang": "en",
            "text": "CRYOBS-CLIM"
        }],
        "fundings": [{
                "type": "Organisation",
                "acronym": "IRD",
                "name": [{
                    "lang": "en",
                    "text": "Institut de Recherche pour le Développement"
                }]
            },
            {
                "type": "Organisation",
                "acronym": "CNRS",
                "name": [{
                    "lang": "en",
                    "text": "Centre National de la Recherche Scientifique"
                }]
            }
        ]
    }
}

На последнем этапе конвейера выполняется следующая операция FacetOperation, которая возвращает исключение, как если бы операция unwind не была выполнена.

FacetOperation facetOperationTest = 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("fundingAcronymsFacet");

Эта FacetOperation работает как талисман, если выполняется в MongoShell как:

{
    "$facet": {
        "fundingAcronymsFacet": [{
            "$unwind": "$producer.fundings"
        }, {
            "$project": {
                "type": "$producer.fundings.type",
                "name": "$producer.fundings.acronym"
            }
        }, {
            "$group": {
                "_id": {
                    "name": "$name",
                    "type": "$type"
                },
                "count": {
                    "$sum": 1
                }
            }
        }, {
            "$project": {
                "count": 1,
                "name": "$_id.name",
                "type": "$_id.type",
                "_id": 0
            }
        }]
    }
}

Кто-нибудь уже сталкивался с таким неожиданным поведением?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...