Оптимизация конвейера агрегирования Mongodb - 2 этапа $ match - PullRequest
0 голосов
/ 10 июня 2019

В последнее время я занимаюсь оптимизацией производительности конвейера агрегации.Я столкнулся с этой проблемой, когда решал, что индексироватьЯ установил составной индекс для {'receiverId': 1,'type': 1 }.Мой оригинальный конвейер выглядит так.Я думаю, нужно ли индексировать isRead тоже.Причина, по которой я не создал составной индекс из трех полей, потому что другие запросы используют только recieverId и type.

notifications.aggregate([{
        $match: {
            'recieverId': ObjectId(xxx),
            'type': xxx,
            'isRead': false
        }
    },
    {
     ...
    },
], (err, result) => {
    return res.status(200).json(result);
});

Итак, я изменил это ниже.Интересно, может ли такой конвейер сэкономить некоторые вычислительные затраты после фильтрации recieverId и type.Будет ли isRead, второй $match фильтр от результата первого $match?

notifications.aggregate([{
        $match: {
            'recieverId': ObjectId(xxx),
            'type': xxx,
        }
    },
    {
        $match: {
            'isRead': false
        }
    },
    {
     ...
    },
], (err, result) => {
    return res.status(200).json(result);
});

1 Ответ

1 голос
/ 10 июня 2019

На самом деле не имеет значения, как вы пишете это, поскольку Монго оптимизирует этот конвейер.

Из документов:

Когда $ match сразу следует за другим $ match, эти два этапа могут объединиться в один $ match.

Прочтите об этом и других конвейерных оптимизациях, которые Mongo делает здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...