mongodb查找match-expr作为第二个管道步骤

时间:2018-09-12 12:51:14

标签: mongodb aggregation-framework

我对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> ]

1 个答案:

答案 0 :(得分:0)

经过调查,我得出以下结论:

在继续阅读之前,建议您阅读我对问题的所有修改。尤其是我的第二次编辑。

似乎$ expr中的$ eq根本无法比较固定索引。

此表达式根本不起作用:

{
  $expr: {
    $eq: [ '$arr.foreignField.0': '$$localField' ]
  }
}

要解决此问题,我在此阶段之前创建了一个投影,该投影从所需的固定索引中提取值并将其存储在新字段中。所以现在内部管道的特定阶段看起来像这样:

...
{
  $project: {
    value: { $arrayElemAt: [ '$arr.foreignField', 0 ] }
  }
},
{ 
  $match: {
    $expr: {
      $eq: [ '$value', '$$localField' ]
    }
  }
}
...