Я пытаюсь написать конвейер агрегации для экспорта данных системы обмена сообщениями, и он включает в себя небольшую вложенность конвейера поиска.В настоящее время я испытываю выступления, которые противоречат моим ожиданиям.Кажется, что следующий запрос выполняется очень долго (если он вообще выполняется):
conversations.aggregate([
{
"$match": {
...
}
},
{
"$lookup": {
"from": "messages",
"let": {"convo_id": "$_id"},
"pipeline": [
{
"$match": {
"$expr": {
"$eq": ["$conversation_id", "$$convo_id"]
}
}
},
{
"$sort": {
"created": 1
}
},
{
"$lookup": {
"from": "users",
"localField": "user_id",
"foreignField": "_id",
"as": "user"
}
},
{
"$unwind": {
"path": "$user",
"preserveNullAndEmptyArrays": true
}
}
],
"as": "messages"
}
},
{
"$project": {
...
}
}
])
Однако , если я переместлю стадию $sort
так, чтобы $lookup
и / или $unwind
этапов предшествуют этому, запрос выполняется мгновенно.Я также проверил результаты вывода, и, похоже, все они верны (это наводит меня на мысль, что это на самом деле обработка этапа сортировки, а не просто его игнорирование).
Это противоречит ожидаемому поведению.Я ожидаю, что этап $sort
после $match
и до $lookup
и $unwind
будет работать быстрее, но, похоже, происходит обратное.Мне интересно, может ли кто-нибудь понять, почему это происходит.