Mongodb 双$lookup聚合中的性能问题
以下mongodb查询适用于我:Mongodb 双$lookup聚合中的性能问题,mongodb,Mongodb,以下mongodb查询适用于我: db.customers.aggregate([ { $lookup: { from: 'orders', localField: 'orders', foreignField: '_id', as: 'orders_docs' } }, { $unwind: "$orders_doc
db.customers.aggregate([
{
$lookup:
{
from: 'orders',
localField: 'orders',
foreignField: '_id',
as: 'orders_docs'
}
},
{
$unwind: "$orders_docs"
},
{
$lookup:
{
from: 'products',
localField: 'orders_docs._id',
foreignField: 'orders',
as: 'products_docs'
}
},
{
$match:
{
'products_docs._id': mongoose.Types.ObjectId(req.params.product_id)
}
}
])
通过它,我找到了特定产品的买家(req.params.product\u id
)
我的模式是:Products
hasManyOrders
和Customers
hasManyOrders
当我增加记录的数量时,我的问题就来了:例如,10万个订单(看起来仍然很低)、10万个客户和10万个产品,请求似乎还没有结束
我在我的3个集合上没有任何特定的索引,但是我只使用\u id
s(它们是自然索引)来满足我的请求,不是吗
因此,我的问题是:如何提高此请求的性能?查找不使用索引,因此导致此聚合完全扫描所有3个集合, 我建议您从products集合中“启动”聚合,因为您正在寻找特定的产品id
db.products.aggregate([
{
$match:
{
'_id': mongoose.Types.ObjectId(req.params.product_id)
}
},
{
$lookup:
{
from: 'orders',
localField: 'orders',
foreignField: '_id',
as: 'orders_docs'
}
},
{
$unwind: "$orders_docs"
},
{
$lookup:
{
from: 'users',
localField: 'orders_docs._id',
foreignField: 'orders',
as: 'users'
}
},
])
假设所有订单中都没有产品,这将“希望”使查询变得更小
还考虑添加项目阶段来删除冗余的字段,如果您有一个大字段,这将是非常有用的。
如果运行时仍然是一个问题,考虑重新构造数据以包含较小的映射对象进行查找。
可以从所有集合中发布示例文档吗?