Cosmos DB聚合管道Mongo查询和保留字

时间:2019-03-11 13:13:04

标签: mongodb azure-cosmosdb azure-cosmosdb-mongoapi

有人在汇总管道方面遇到问题吗?专门使用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模拟器上)时,我得到以下结果:

{
    "_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,对分组没有影响。 -将as阶段的lookup字段中的别名集合的名称更改为application

以外的名称

我有以下断言:

  • application是保留关键字,即使用作字段名的前缀也有效。
  • application仅是Cosmos中的保留关键字(这是由于SQL中的Application保留字吗?(SQL API))

我知道在vacancies集合上调用applicationMethod以外的源字段可以解决此问题,但这对现有文档不可行,而且我希望继续使用该命名。看来Cosmos DB及其处理聚合管道的group阶段的方式存在问题。

1 个答案:

答案 0 :(得分:1)

在使用MS提出此问题后,他们建议我以application以外的名称开始别名查找的名称,因此我选择了candidateApplication,然后选择了我要在组中使用的applicationMethod字段阶段反应出现了。

他们已将其归档为将来会更正的内容,但要保证的是,不要将别名称为与您在$ group阶段中使用的任何字段名称都部分匹配的名称。聚合管道。