Я использую следующий конвейер агрегации и у меня странное поведение в 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
}
}]
}
}
Кто-нибудь уже сталкивался с таким неожиданным поведением?