繁体   English   中英

Mongodb 查找 -> 匹配 -> 组花费太多时间

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM