Mongodb Mongo聚合:查找后的排序阶段和展开太慢

Mongodb Mongo聚合:查找后的排序阶段和展开太慢,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个集合,它有大约30个属性,其中2个是与其他2个集合的关系(ObjectId)。我需要能够按两个子集合的列对父集合进行排序 为此,我编写了一个管道,如下所示: Document.aggregate([ { $match: { deleted: false, }, }, { $lookup: { from: 'companies', localField: 'company', foreignFie

我有一个集合,它有大约30个属性,其中2个是与其他2个集合的关系(ObjectId)。我需要能够按两个子集合的列对父集合进行排序

为此,我编写了一个管道,如下所示:

 Document.aggregate([
  {
    $match: {
      deleted: false,
    },
  },
  {
    $lookup:
    {
      from: 'companies',
      localField: 'company',
      foreignField: '_id',
      as: 'company',
    },
  },
  {
    $unwind:
    {
      path: '$company',
      preserveNullAndEmptyArrays: true,
    },
  },
  {
    $lookup:
    {
      from: 'suppliers',
      localField: 'supplier',
      foreignField: '_id',
      as: 'supplier',
    },
  },
  {
    $unwind:
    {
      path: '$supplier',
      preserveNullAndEmptyArrays: true,
    },
  },
  {
    $sort: { 'company.name': -1 },
  },
  {
    $skip: 0,
  },
  {
    $limit: 10,
  }
]);
问题是这太慢了。在Compass中,它超过了时间限制,当我在node中运行它时,处理它大约需要10秒。父集合的大小约为60k。如果没有分拣阶段,它将运行约25毫秒。另外,当我移动管道顶部的排序阶段时,它运行得非常快,但是如果我想按“company.name”属性排序,结果是不正确的。父集合中的“公司”和“供应商”属性都已编制索引

我已经读到,为了让排序阶段使用索引,它需要与“匹配”阶段一起放在管道的开头,但这不符合我通过子集合的属性进行排序的要求。是否不可能在100毫秒内完成此运行?我错过了什么

编辑1

以下是解释:

{ stages:
   [ { '$cursor':
        { query: { state: true },
          queryPlanner:
           { plannerVersion: 1,
             namespace: 'test.documents',
             indexFilterSet: false,
             parsedQuery: { state: { '$eq': true } },
             winningPlan:
              { stage: 'FETCH',
                inputStage:
                 { stage: 'IXSCAN',
                   keyPattern: { state: 1 },
                   indexName: 'state_1',
                   isMultiKey: false,
                   multiKeyPaths: { state: [] },
                   isUnique: false,
                   isSparse: false,
                   isPartial: false,
                   indexVersion: 2,
                   direction: 'forward',
                   indexBounds: { state: [ '[true, true]' ] } } },
             rejectedPlans: [] } } },
     { '$lookup':
        { from: 'companies',
          as: 'company',
          localField: 'company',
          foreignField: '_id',
          unwinding: { preserveNullAndEmptyArrays: true } } },
     { '$lookup':
        { from: 'suppliers',
          as: 'supplier',
          localField: 'supplier',
          foreignField: '_id',
          unwinding: { preserveNullAndEmptyArrays: true } } },
     { '$sort': { sortKey: { 'company.name': -1 }, limit: 10 } } ],
  ok: 1 }

在文档集合中,
公司
供应商
状态
字段都是索引。

公司
开始,以便排序和匹配,怎么样,然后
$lookup
文档
进行
删除
过滤?@willis:这是对前端数据表的动态搜索/过滤。可能有许多筛选器/排序等。包含最多数据的集合是大集合(60k个条目)。如果我从
公司开始
,我觉得这不是一个永久的/最佳的解决方案,而且我几乎可以肯定其他方面会有问题。好吧,那么初始的
$match
可能比显示的更复杂,对吗?我不太了解聚合管道,不知道是否有解决方案,但您可以尝试从管道的其余部分中分离出
Document$match
,这样就可以按公司进行$match和$sort。如果你分享一些
explain
output和你当前的索引,其他人可能会给出更好的建议。@willis更新了问题!Thanks@Arlind你找到解决办法了吗?