Mongodb 关于聚合运行机制的几个问题

Mongodb 关于聚合运行机制的几个问题,mongodb,Mongodb,聚合1: db.collection.aggregate([ { $lookup: { ... } }, { $limit: 1 } ]) 聚合2: db.collection.aggregate([ { $limit: 1 }, { $lookup: { ... } } ]) Aggregate1和Aggregate2不同吗 在Aggregate1中,是否先扫描整个集合,然后执行$loo

聚合1:

db.collection.aggregate([
  {
    $lookup: {
      ...
    }
  },
  {
    $limit: 1
  }
])
聚合2:

db.collection.aggregate([
  {
    $limit: 1
  },
  {
    $lookup: {
      ...
    }
  }
])
Aggregate1和Aggregate2不同吗

在Aggregate1中,是否先扫描整个集合,然后执行$lookup

如果不同,如何使用一些查询进行查找?如下所示:

db.collection.aggregate([
  {
    $lookup: {
      from: 'collection2',
      localField: 'field',
      foreignField: 'field',
      as: 'newField',
      // do some query when lookup
      query: {'newField.xxx': 1}
    }
  }
])
我知道,我能做到:

db.collection.aggregate([
  {
    $lookup: {
      from: 'collection2',
      localField: 'field',
      foreignField: 'field',
      as: 'newField'
    }
  },
  {$unwind: '$newField'},
  {$match: {'newField.xxx': 1}}
])
但我担心,像上面的例子一样,整个收藏都会被扫描

期待您的回复

现在,我发现这个api:,但是:

不能在此筛选器中使用任何聚合表达式

例如,查询文档,如

{ lastName: { $ne: "$lastName" } }
无法在此上下文中查找lastName所在的文档 值与输入文档的lastName值不同, 因为“$lastName”将充当字符串文字,而不是字段路径


在查找阶段不能包含文档。查找执行左连接,因此您可以选择限制进入查找阶段的内容。就像你在聚合中过滤文档一样。图形查找进行递归查找,因此选择该选项的原因是。您在最后一个示例中介绍了“展开”和“匹配”,该示例已优化,可用于查找。所以可能没那么糟糕。看看这个@SagarReddy,我还不确定它是否会合并。我希望这能证实@好的,非常感谢!我将尝试使用聚合解释,并告诉您结果您无法在查找阶段包含文档。查找执行左连接,因此您可以选择限制进入查找阶段的内容。就像你在聚合中过滤文档一样。图形查找进行递归查找,因此选择该选项的原因是。您在最后一个示例中介绍了“展开”和“匹配”,该示例已优化,可用于查找。所以可能没那么糟糕。看看这个@SagarReddy,我还不确定它是否会合并。我希望这能证实@好的,非常感谢!我将尝试使用聚合解释并告诉您结果