MongoDB: $ match с $ или оптимизация агрегации - PullRequest
0 голосов
/ 28 марта 2020

Я столкнулся с проблемой, как оптимизировать этот $ match. В настоящее время у меня есть этот код

{ $match: {
            $or: [
                { 'card': { $eq: 'card1'},
                 $and: [
                         { 'createdAt': { $gte: three_months }},
                         { 'createdAt': { $lte: createdAt }}
                        ]
                },
                { 'client': { $eq: 'client1'},
                 $and: [
                         { 'client': { $ne: null }},
                         { 'createdAt': { $gte: three_months }},
                         { 'createdAt': { $lte: createdAt }}
                        ]
                },
            { 'destination_card': { $eq: 'destination_card1'},
                 $and: [
                         { 'createdAt': { $gte: three_months }},
                         { 'createdAt': { $lte: createdAt }}
                        ]
                },

            ]
           }
{ $limit: 300},
{ $sort: { createdAt: -1 } },

Но иногда вычисления неверны или выполняются слишком долго. Подскажите, пожалуйста, как это оптимизировать? Большое спасибо заранее!

1 Ответ

0 голосов
/ 29 марта 2020

Если вы используете более новую версию MongoDB (я думаю, 3.6+), планировщик запросов может использовать несколько индексов для обработки $or. Каждая ветвь использует одни и те же критерии для createdAt, поэтому вы можете собрать их вместе, чтобы перечислить только один раз, например:

{$match: {
     {'createdAt':{$gte: three_months, $lte: createdAt}},
     {$or:[
        {'card': 'card1'},
        {'client': 'client1'},
        {'destination_card': 'destination_card1
     ]}
}}

Если вы создадите 3 индекса, каждый из которых имеет одно из полей точного соответствия и createAt, как и {card:1, createdAt:1}, это улучшит выбор и сократит количество проверенных документов, что может помочь во времени выполнения.

Обратите внимание, что использование $or обычно не позволяет исполнителю запроса использовать индекс для выполнения сортировки, что требует сортировка в памяти при каждом выполнении этого запроса, что увеличивает объем оперативной памяти, необходимой для выполнения этого запроса, что может замедлить выполнение, когда сервер занят.

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