mongo 聚合 $lookup 与数组

mongo aggregation $lookup with arrays

我有这样的结构

unions {              // collection
  members {           // array
    instanceId        // some id
    ...
  }
  ...
}

在文档中,我有 ids 属性(数组) 我需要从 ids(基本上是 $in)

中查找至少有一个 id 的所有联合

问题是它不起作用

首先我想试试这个变体

{
  from: 'unions',
  let: { instanceIds: '$ids'  },
  as: 'unions',
  pipeline: [
    {
      $match: { 'members.instanceId': { $in: '$$instanceIds' } },
    },
  ],
}

但是我们不能在这里使用聚合变量。为此,我们需要使用 $expr

{
  from: 'unions',
  let: { instanceIds: '$ids'  },
  as: 'unions',
  pipeline: [
    {
      $match: {
        $expr: {
          $in: ['$members.instanceId', '$$instanceIds']
        }
      },
    },
  ],
}

但是呢returns0个文件。 instanceIds 数组不为空,我已经检查过了。 另外,如果我在没有 $expr 的示例中粘贴一个包含值的数组,那么它 returns 是正确的值。所以最有可能的问题是我如何构建这个 $lookup.

使用 { $ne: [{ $setIntersection: ['$members.instanceId', '$$instanceIds'] }, []] }

{
  from: 'unions',
  let: { instanceIds: '$ids'  },
  as: 'unions',
  pipeline: [
    {
      $match: {
        $expr: {
          cond: { $ne: [{ $setIntersection: ['$members.instanceId', '$$instanceIds'] }, []] },
        },
      },
    },
  ],
}