2

我有 2 个这样的集合,作为A1.5kk 文档集合:

A
_id
relation: { alias, ref: 'B/<_id>' }

B
_id
name

我想查询 中A不存在的元素B。这是我到目前为止得到的:

db.getCollection('A').aggregate([
    {
        $project: {
            'relation.ref': {
                $arrayElemAt: [
                    { $split: ['$relation.ref', '/'] }, 1
                ]
            },
            a: "$$ROOT"
        }
    },
    {
        $lookup: {
            from: 'B',
            localField: 'relation.ref',
            foreignField: '_id',
            as: 'b'
        }
    }
]);

这确实以这种模式返回:

{
  _id,
  relation.ref,
  a: {},
  b: [{}]
}

好吧,我希望添加一个 $match 子句来仅包含 b 为空数组的子句。就像是${match: { b: {$size: 0} } }

问题是这个查询似乎花费了太长时间。我从未见过它工作,因此我不知道这是正确的方法。

有什么可以让它表现得更好或有什么不同的方法来获得它吗?

例如,如果我强制连接错误,它将返回一个空数组b。但是查询这个数组的大小总是很慢,即使我查询{$size: 1}99,9% 的结果也是如此。我想知道我是否可以做这样的事情来在加入期间只选择缺失的值:

{$lookup.pipeline: [{$myself: null}] }

请问有什么想法吗?

谢谢

4

1 回答 1

1

你的$match语法很接近但有点偏离,你应该使用这样的东西:

{
    $match: {
      $expr: {
        $eq: [
          0,
          {
            $size: "$b"
          }
        ]
      }
    }
  }

Mongo游乐场

relation但是,将字段更新为仅包含有效引用不是更容易吗?如果是这种情况,您可以查询'relation.ref': {$exists: false}

于 2020-07-13T14:03:49.883 回答