将Mongodb聚合查找函数与管道一起使用不会通过使用match with variable返回预期结果,仅当不使用该变量并给出_id时,match才能按预期执行。
我已经建立了一个管道,并且我的查找阶段使用_id变量作为其中的集合,以引用查找集合并搜索关联项列表。当我在决赛中使用已知的_id时,可以得到预期的结果,但是,当我从查找的“ let”部分使用变量_id时,将返回一个空数组。我尝试使用ObjectId()函数内部的变量,将其用作字符串,或直接使用它。我还进行了一个投影,以发现该变量返回正确的ID。
如果我不使用最终匹配,则流水线的前两个阶段的所有结果都将附加到DAU,这确实表明联接值位于最终$ match之前的流水线中。
Assoc_Certs是一个ObjectId数组,例如:
Assoc_Certs: { 0: ObjectId('1234'), 1: ObjectId('1235'), 2: ObjectId('1236')}
certs._id是用于变量的ObjectId,可以在Assoc_Certs数组中找到。
db.certs.aggregate([
{
'$match': {
'Active': true,
'Category': 'Certification'
}
}, {
'$lookup': {
'from': 'dau',
'let': {
'objid': '$_id'
},
'pipeline': [
{
'$match': {
'Alloc_Period_Info.e_date': {
'$gte': new Date('Fri, 30 Aug 2019 06:00:00 GMT')
}
}
}, {
'$project': {
'DAU_ID': 1,
'Alloc': {
'$filter': {
'input': '$Alloc_Period_Info',
'as': 'dt',
'cond': {
'$gte': [
'$$dt.e_date', new Date('Fri, 30 Aug 2019 06:00:00 GMT')
]
}
}
},
'Assoc_Certs': 1
}
}, {
'$match': {
'Assoc_Certs': '$$objid'
}
}
],
'as': 'DAU'
}
}
]);
如果我在下一个阶段替换最终的$ match,则管道将提供预期的结果。
{'$match': {Assoc_Certs: ObjectId('5c1d5b465c31a417bdcb7249')}}
使用项目$$ objid是ObjectId('5c1d5b465c31a417bdcb7249')
预期结果是管道查找将Assoc_Certs加入到$$ objid中传递的变量,而DAU字段将只有一条记录。