Mongodb 聚合阶段 $match 结果超时错误

Mongodb aggregation stage $match results with timeout error

users_table 中有大约 9000 个用户,订单数最多的用户有大约 300 个订单。

当我使用下面的代码查询时,一切正常,直到 $match 阶段。它需要超过 20 秒,因此查询会导致超时错误。我知道我可以增加消除该错误的时间,但我想知道为什么一个简单的 $match 阶段需要很长时间?

db.getCollection('users_table').aggregate([
{
// user.id field is related to order.user_id field 
  '$lookup': {
    'from': 'orders_table',
    'localField': 'id',
    'foreignField': 'user_id',
    'as': 'orders'
  }
},
{
// I keep user.id and the delivered orders
  '$project': {
    'id': 1,
    'filtered_orders': {
      '$filter': {
        'input': '$orders',
        'as': 'order',
        'cond': {'$eq':['$$order.status', 'delivered']}
      }
    }
  }
},
{
// get rid of _id and get delivered order count as well as user.id
  '$project': {
    '_id': 0,
    'id': 1,
    'order_count': {'$size': '$filtered_orders'}
  }
},
{
// get order_count field between 200 and 350
  '$match': {
    'order_count' : {'$gte': 200, '$lte': 350}
  }
}
])

试试这个查询。还要确保 orders_table 中的 'status' 已编入索引

db.getCollection('orders_table').aggregate([
  {
    '$match': {
      'status' : 'delivered'
    }
  },
  {
    $group:{
      _id:'$user_id',
      order_count: { $sum: 1 }
      user_id:'$user_id',
    }
  },
  {
    '$match': {
      'order_count' : {'$gte': 200, '$lte': 350}
    }
  },
])

考虑添加索引

db.users_table.createIndex( { id: 1 }, { background: true } )
db.orders_table.createIndex( { user_id: 1 }, { background: true } )