我对mongodb聚合还比较陌生,但有一个小问题:
我想在两个集合之间建立连接。问题是,外来字段放置在内部数组中。这意味着我必须展开数组以进行适当的$ match。在我的$ match中,我使用$ epxr和$ eq来对未展开的文档进行联接(这是有意的,因此没有问题)。需要$ expr来访问原始集合中的变量:
[
...
{
$lookup: {
from: 'foreignCollection',
as: 'field',
let: {
localField: '$someComparisonField'
},
pipeline: [
{
$unwind: '$arr'
},
{
$match: {
$expr: {
$eq: [ '$arr.foreignField', '$$localField' ]
}
}
}
]
}
}
]
但是,field
在我的结果集中始终是一个空数组。我真的不知道我在做什么错:D
有人可以帮我吗?
编辑: 根据要求,提供了两个涉及的集合的一些示例数据:
orginalCollection:
{
...
someComparisonField: 1
},
{
...
someComparisonField: 2
}
foreignCollection:
{
...
arr: [
{
...
foreignField: 1
},
{
...
foreignField: 1
},
{
...
foreignField: 2
},
]
},
{
...
arr: [
{
...
foreignField: 1
},
{
...
foreignField: 2
},
{
...
foreignField: 2
},
]
},
{
...
arr: [
{
...
foreignField: 2
},
{
...
foreignField: 1
},
{
...
foreignField: 2
},
]
},
编辑2:
我忘了添加一个小细节:内部管道中有$ eq,我正在访问固定索引,这意味着foreignField
实际上看起来像这样:foreignField: [ <value> ]
。
答案 0 :(得分:0)
经过调查,我得出以下结论:
在继续阅读之前,建议您阅读我对问题的所有修改。尤其是我的第二次编辑。
似乎$ expr中的$ eq根本无法比较固定索引。
此表达式根本不起作用:
{
$expr: {
$eq: [ '$arr.foreignField.0': '$$localField' ]
}
}
要解决此问题,我在此阶段之前创建了一个投影,该投影从所需的固定索引中提取值并将其存储在新字段中。所以现在内部管道的特定阶段看起来像这样:
...
{
$project: {
value: { $arrayElemAt: [ '$arr.foreignField', 0 ] }
}
},
{
$match: {
$expr: {
$eq: [ '$value', '$$localField' ]
}
}
}
...