кто-нибудь испытывал проблемы с агрегатным конвейером?В частности, используя Mongo API?У меня довольно большой запрос с несколькими этапами, этап $ group не может найти определенное поле в выходных данных предыдущего этапа $ project, хотя, если я закомментирую этап $ group, я определенно смогу увидеть поле, которое я ожидалвывод как часть $ project.
Следующее устанавливает две коллекции, каждая с одним документом для демонстрационных целей.
db.vacancies.insert({
"_id" : NUUID("35b3068c-d300-4ae1-bf45-cb00f0f7c37b"),
"employerAccountId" : "MYJR4X",
"vacancyReference" : NumberLong(1000000021),
"status" : "Closed",
"applicationMethod" : "ThroughPhone",
"closingDate" : ISODate("2019-03-01T00:00:00.000Z")
});
db.applicationReviews.insert({
"_id" : NUUID("43a7764a-7d4d-465b-9c30-9934848c009c"),
"candidateId" : NUUID("84dc9645-605c-4606-812b-117b090020b0"),
"vacancyReference" : NumberLong(1000000021),
"status" : "New",
"createdDate" : ISODate("2018-09-27T13:46:09.801Z")
});
Ниже приведен агрегированный конвейерный запрос:
db.vacancies.aggregate([
{
"$match":{
"employerAccountId":"MYJR4X"
}
},
{
"$lookup":{
"from":"applicationReviews",
"localField":"vacancyReference",
"foreignField":"vacancyReference",
"as":"application"
}
},
{
"$unwind":{
"path":"$application",
"preserveNullAndEmptyArrays":true
}
},
{
"$project":{
"vacancyGuid":"$_id",
"vacancyReference":1,
"status":1,
"appStatus":"$application.status",
"closingDate":1,
"applicationMethod":1
}
},
{
"$project":{
"vacancyGuid":1,
"vacancyReference":1,
"status":1,
"closingDate":1,
"applicationMethod":1,
"isNew":{
"$cond":{
"if":{
"$eq":[
"$appStatus",
"New"
]
},
"then":1,
"else":0
}
},
"isSuccessful":{
"$cond":{
"if":{
"$eq":[
"$appStatus",
"Successful"
]
},
"then":1,
"else":0
}
},
"isUnsuccessful":{
"$cond":{
"if":{
"$eq":[
"$appStatus",
"Unsuccessful"
]
},
"then":1,
"else":0
}
}
}
},
{
"$group":{
"_id":{
"vacancyGuid":"$vacancyGuid",
"vacancyReference":"$vacancyReference",
"status":"$status",
"applicationMethod": "$applicationMethod",
"closingDate":"$closingDate"
},
"noOfNewApplications":{
"$sum":"$isNew"
},
"noOfSuccessfulApplications":{
"$sum":"$isSuccessful"
},
"noOfUnsuccessfulApplications":{
"$sum":"$isUnsuccessful"
}
}
}
]);
При использовании MongoDB я получаю следующий результат:
{
"_id" : {
"vacancyGuid" : NUUID("35b3068c-d300-4ae1-bf45-cb00f0f7c37b"),
"vacancyReference" : NumberLong(1000000021),
"status" : "Closed",
"applicationMethod" : "ThroughPhone",
"closingDate" : ISODate("2019-03-01T00:00:00.000Z")
},
"noOfNewApplications" : 1.0,
"noOfSuccessfulApplications" : 0.0,
"noOfUnsuccessfulApplications" : 0.0
}
Я ожидаю вышеизложенного, однако при использовании Cosmos DB, размещенного на Azure или в Azure Cosmos Emulator, я получаю следующеерезультат:
{
"_id" : {
"vacancyGuid" : NUUID("35b3068c-d300-4ae1-bf45-cb00f0f7c37b"),
"vacancyReference" : 1000000021,
"status" : "Closed",
"closingDate" : ISODate("2019-03-01T00:00:00.000Z")
},
"noOfNewApplications" : 1.0,
"noOfSuccessfulApplications" : 0.0,
"noOfUnsuccessfulApplications" : 0.0
}
^^ обратите внимание, что поле applicationMethod
не возвращается.
Я пробовал следующее: - комментирование / удаление фазы group
агрегатного конвейера -фазы проецирования возвращаются applicationMethod
правильно - наложение поля applicationMethod
в стадиях проецирования на другое имя, например am
, не имеет значения для grouping.- изменив имя псевдонима коллекции в поле as
фазы lookup
на что-то отличное от application
У меня есть следующие утверждения:
application
является зарезервированным ключевым словом, которое действует даже при использовании в качестве префикса имени поля. application
является зарезервированным ключевым словом только в Cosmos (это из-за зарезервированного слова приложения в SQL? (SQL API))
Я знаю, что вызов моего исходного поля в коллекции vacancies
, отличающийся от applicationMethod
, решил бы эту проблему, но это нецелесообразно для существующих документов, а также для именования, которое я хотел быпродолжать использовать.Кажется, есть проблема с Cosmos DB и тем, как он обрабатывает этап group
агрегатного конвейера.