所以我正在执行一个 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 内部是否正在增加往返次数以获得正确的销售? 每个集合都有关于性能的正确索引,所以它实际上与索引无关。
你对此有何看法?
非常感谢您的帮助!