Космос ДБ Совокупный конвейерный монго-запрос и зарезервированные слова - PullRequest
1 голос
/ 11 марта 2019

кто-нибудь испытывал проблемы с агрегатным конвейером?В частности, используя 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 агрегатного конвейера.

1 Ответ

1 голос
/ 14 марта 2019

После поднятия этого с MS они предложили, чтобы я начинал имя поиска с псевдонимом с чем-то отличным от application, поэтому я выбрал candidateApplication, а затем появилось поле applicationMethod, которое я хотел в ответе групповой стадии.

Они подали это как то, что исправят в будущем, но вы должны убедиться, что псевдоним не называется чем-то, что даже частично соответствует любому из имен полей, которые вы бы использовали на фазе $ group ofагрегатный трубопровод.

...