[英]Mongodb lookup -> match -> group taking too much time
我部署了一个生产应用程序,它每天都会生成大量数据。 但是这个查询通常需要大约 15 秒才能完成。 这不行。 我想要它的方式快。 我如何重写此查询以进行优化以及这里出了什么问题?
const activity_data = await Activity.aggregate([
{
$lookup: {
from: 'tokens',
localField: 'n_id',
foreignField: 'token_id',
as: 'sale_status'
},
},
{
$match: {
activity_type: 'FOR_SALE',
'sale_status.for_sale': true,
}
},
{
$group: {
_id: '$n_id',
createdAt: { $max: '$createdAt' },
},
},
{
$sort: { createdAt: -1 }
},
{
$limit: 15
}
]);
通过简要查看您的查询,您可以进行一些小的调整以最小化中间结果。
db.collection.aggregate([
{
"$match": {
activity_type: "FOR_SALE"
}
},
{
$lookup: {
from: "tokens",
let: {
n: "$n_id"
},
pipeline: [
{
"$match": {
$expr: {
$and: [
{
$eq: [
"$$n",
"$token_id"
]
},
{
$eq: [
"$for_sale",
true
]
}
]
}
}
}
],
as: "sale_status"
},
},
{
$match: {
"sale_status.for_sale": true
}
},
{
$group: {
_id: "$n_id",
createdAt: {
$max: "$createdAt"
}
}
},
{
$sort: {
createdAt: -1
}
},
{
$limit: 15
}
])
您可以看到activity_type
过滤器已移至较早阶段。 for_sale
过滤器也被移动到子管道中以最小化查找结果。
如果您的查询提供了更多上下文,则可能有更多事情要做。 如果可以选择将for_sale
字段反规范化到Activity
集合中,则可以跳过$lookup
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.