【问题标题】:mongodb lookup match-expr as second pipeline stepmongodb 查找 match-expr 作为第二个管道步骤
【发布时间】:2019-02-17 02:59:05
【问题描述】:

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

有人可以帮我吗?

编辑: 根据要求,两个涉及的集合的一些示例数据:

原始收藏:

{
  ...
  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> ]

【问题讨论】:

  • 你能发布你的样本集吗
  • @AnthonyWinzlet 已更新 :)
  • 我看不出上面的代码有什么问题。可能是集合名称不正确。
  • @AnthonyWinzlet 你能看看我的回答吗?我做了一些进一步的调查......

标签: mongodb aggregation-framework


【解决方案1】:

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

在进一步阅读之前,我建议阅读我对问题的两个编辑。尤其是我的第二次编辑。

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

这个表达式根本不起作用:

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

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

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

【讨论】:

  • 一个可以工作,但速度极慢,因为$expr 不使用多键索引:(
猜你喜欢
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多