Неожиданное поведение производительности для агрегата поиска Mongodb - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь написать конвейер агрегации для экспорта данных системы обмена сообщениями, и он включает в себя небольшую вложенность конвейера поиска.В настоящее время я испытываю выступления, которые противоречат моим ожиданиям.Кажется, что следующий запрос выполняется очень долго (если он вообще выполняется):

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

...