Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 双$lookup聚合中的性能问题_Mongodb - Fatal编程技术网

Mongodb 双$lookup聚合中的性能问题

Mongodb 双$lookup聚合中的性能问题,mongodb,Mongodb,以下mongodb查询适用于我: db.customers.aggregate([ { $lookup: { from: 'orders', localField: 'orders', foreignField: '_id', as: 'orders_docs' } }, { $unwind: "$orders_doc

以下mongodb查询适用于我:

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
hasMany
Orders
Customers
hasMany
Orders

当我增加记录的数量时,我的问题就来了:例如,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'
        }
      },
    ])
假设所有订单中都没有产品,这将“希望”使查询变得更小

还考虑添加项目阶段来删除冗余的字段,如果您有一个大字段,这将是非常有用的。


如果运行时仍然是一个问题,考虑重新构造数据以包含较小的映射对象进行查找。

可以从所有集合中发布示例文档吗?