带有子查询的 Mongodb 查找聚合

问题描述 投票:0回答:0

所以我正在执行一个 mongodb 查询,我实际上执行了一个连接 里面有一个子查询。

堆栈:MeteorJs:2.8/mongodb > 4.4

我有 2 个集合:客户(大约 60000 个文档)和销售(大约 50000 个文档)。

我想做的是执行聚合以获取客户并将销售加入其中。

客户文档如下所示:

{
  _id,
  name,
  ...
}

销售文件如下所示:

{
   _id,
   customerIds : [<arrayOfCustomers>]
}

您可能已经猜到了,我尝试加入在其 customerIds 数组中包含客户 _id 的销售。

管道看起来像这样:

const pipeline = [
{
  $match: {...}
},
{
  $lookup: {
    from: 'sales',
    let: { customerId: '$_id' },
    as: 'sales',
    pipeline: [
      {
        $match: {
          $expr: { $in: ['$$customerId', '$customerIds'] }
        }
      },
    ]
  }
}];

const customers = await Customers.rawCollection().aggregate(pipeline).toArray();

实际上管道和查找工作正常但非常(非常)慢(超过 20 秒)

如果我在没有管道的情况下进行简单查找,它会再次变得“正常”(1.5 秒)

我的意思是我正在供应管道,所以我要检索的销售文件较少,但恰恰相反 正在发生。

Mongodb 内部是否正在增加往返次数以获得正确的销售? 每个集合都有关于性能的正确索引,所以它实际上与索引无关。

你对此有何看法?

非常感谢您的帮助!

mongodb meteor
© www.soinside.com 2019 - 2024. All rights reserved.