Неожиданное поведение производительности для агрегата поиска Mongodb
Я пытаюсь написать конвейер агрегации для экспорта данных системы обмена сообщениями, и он включает в себя небольшую вложенность конвейера поиска. В настоящее время я испытываю выступления, которые противоречат моим ожиданиям. Кажется, что следующий запрос выполняется очень долго (если он вообще выполняется):
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
будет работать быстрее, но, кажется, происходит обратное. Мне интересно, может ли кто-нибудь понять, почему это происходит.