有人在汇总管道方面遇到问题吗?专门使用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
阶段的方式存在问题。
答案 0 :(得分:1)
在使用MS提出此问题后,他们建议我以application
以外的名称开始别名查找的名称,因此我选择了candidateApplication
,然后选择了我要在组中使用的applicationMethod
字段阶段反应出现了。
他们已将其归档为将来会更正的内容,但要保证的是,不要将别名称为与您在$ group阶段中使用的任何字段名称都部分匹配的名称。聚合管道。