Неожиданное поведение производительности для агрегата поиска 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 будет работать быстрее, но, кажется, происходит обратное. Мне интересно, может ли кто-нибудь понять, почему это происходит.

0 ответов

Другие вопросы по тегам