我对mongodb聚合比较陌生,我有一个小问题:
我想把两个集合连接起来。问题是,外域被放置在内部数组中。这意味着我必须展开数组才能生成一个正确的$match。在我的$match中,我使用了一个$epxr和一个$eq,以使连接在没有缠绕的文档上(这是为了解决这个问题)。需要$expr来访问原始集合中的变量:
[
...
{
$lookup: {
from: 'foreignCollection',
as: 'field',
let: {
localField: '$someComparisonField'
},
pipeline: [
{
$unwind: '$arr'
},
{
$match: {
$expr: {
$eq: [ '$arr.foreignField', '$$localField' ]
}
}
}
]
}
}
]但是,在我的结果集中,field总是一个空数组。我真的不知道我做错了什么
有人能帮我吗?
编辑:根据请求的,两个集合的一些样本数据:
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> ]。
发布于 2018-09-13 08:40:34
经调查,我得出以下结论:
在进一步阅读之前,我建议阅读我对这些问题的两个编辑。尤其是我的第二版。
似乎$eq在$expr中根本无法比较一个固定的索引。
这个表达式在某种程度上是行不通的:
{
$expr: {
$eq: [ '$arr.foreignField.0': '$$localField' ]
}
}为了解决这个问题,我在这个阶段之前创建了一个投影,它从所需的固定索引中提取值并将其存储在一个新的字段中。因此,内部管道的特定阶段如下所示:
...
{
$project: {
value: { $arrayElemAt: [ '$arr.foreignField', 0 ] }
}
},
{
$match: {
$expr: {
$eq: [ '$value', '$$localField' ]
}
}
}
...https://stackoverflow.com/questions/52295674
复制相似问题