【发布时间】:2018-03-15 23:09:06
【问题描述】:
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}
}
}
])
【问题讨论】:
-
您是否尝试在 user_id 和 id 上添加索引?
-
不,我没有,因为我还不知道怎么做 :)
-
db.users_table.createIndex( { id: 1 }, { background: true } ) db.orders_table.createIndex( { user_id: 1 }, { background: true } )
-
在这些字段上创建索引解决了这个问题。如果您将评论添加为答案,我可以接受。谢谢!