当前位置: 首页 > 知识库问答 >
问题:

Cosmos DB聚合流水线Mongo查询和保留字

姬阳曜
2023-03-14

有人遇到过聚合管道的问题吗?特别是使用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
}
{
    "_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
}
    null

共有1个答案

黄向明
2023-03-14

在向MS提出这个问题后,他们建议我用application以外的其他名称开始别名查找,所以我选择了candidateapplication,然后出现了我在组阶段响应中想要的applicationmethod字段。

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

 类似资料:
  • 大家好,我有一个大问题在查询我的数据。我有这样的文件: 我想构建两个查询: 1)每天计算标签的数量,然后输出,例如,如下所示: 2)另一个是相同的,但我想设置一个期间从2016-12-13到2016-12-17。 对于第一个查询,我编写了这个查询,并得到了我所搜索的内容,但是在Spring Data Mongo中,我不知道如何编写。

  • 每个人。在mongo组查询中,结果仅显示参数中的键。如何像mysql查询组一样保留每个组中的第一个文档。例如: 结果: 如何获取以下内容:

  • 我使用$geonear作为聚合框架的第一步。我需要过滤掉基于“标签”字段的结果,它工作得很好,但我看到有两种方式都给出了不同的结果。 MongoDB文档示例 我已经向“Position”键添加了2dSphere索引 两个查询返回的totalDocs似乎不同。 有人能给我解释一下这两个查询之间的区别吗?

  • 我不熟悉Mongo中的聚合查询,并且一直在努力产生我想要的输出。我有以下聚合查询: 返回以下结果: 如何修改聚合查询,以便只返回2个文档而不是3个文档?将两个“ABC-123”结果合并为一个结果,并使用带有“bu”和“count”字段的新计数数组,即。 非常感谢

  • >[danger] 注意!!! 使用聚合功能时,必须给它一个别名,以便能够从模型中访问它 > 聚合函数的计算,都是排除了 null 值,所以COUNT( id ) 一般推荐用非空的主键来计算 COUNT 计算数量 const { Sequelize } = app; // 查询班级总人数,按照姓名聚合 const ret = await Student.findAll({ attribut

  • 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: 方法 说明 count 统计数量,参数是要统计的字段名(可选) max 获取最大值,参数是要统计的字段名(必须) min 获取最小值,参数是要统计的字段名(必须) avg 获取平均值,参数是要统计的字段名(必须) sum