В 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}
}
}
])
2 ответа
Рассмотрите возможность добавления индексов
db.users_table.createIndex( { id: 1 }, { background: true } )
db.orders_table.createIndex( { user_id: 1 }, { background: true } )
Попробуйте этот запрос. также убедитесь, что 'status' в orders_table проиндексирован
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}
}
},
])
Похожие вопросы
Новые вопросы
mongodb
MongoDB - это масштабируемая, высокопроизводительная база данных NoSQL с открытым исходным кодом, ориентированная на документы. Он поддерживает большое количество языков и платформ разработки приложений. Вопросы по администрированию сервера можно задать на https://dba.stackexchange.com.