MongoDB $ lookup pipe: используются ли индексы? - PullRequest
1 голос
/ 03 марта 2020

У меня есть запрос, который использует функцию конвейера $ lookup, и он также использует $ expr. Ну, это работает, но производительность не велика. Он просматривает данные в коллекции, содержащей около 4000 документов, и объединяет 2 другие коллекции (используя блоки $ lookup). Для запуска требуется около 2000 мс, хотя в каждой коллекции всего несколько тысяч документов.

Запрос выглядит примерно так:

            {
                $match: {
                   language: 'str'
                }
            },
            {
                $lookup: {
                    from: 'somecollection',
                    let: { someId: '$someId' },
                    pipeline: [
                        {
                            $match: {
                                $expr: {
                                    $and: [
                                        {
                                            $eq: [
                                                '$_id',
                                                '$$someId'
                                            ]
                                        },
                                        {
                                            $gte: ['$field',value]
                                        },
                                        {
                                            $lte: ['$field2',value]
                                        }
                                       ....
                                       // some more conditions..

                                    ]
                                }
                            }
                        }
                    ]

Выполнение объяснения () для этого предоставляет информацию только о первом блоке $ match. Но как определить, использует ли $ expr в конвейере индекс или нет?

Я пытался добавить индексы ко всем полям, используемым в конвейере, и я также пытался создать составной индекс, но я не могу сделать это быстрее.

Как я могу улучшить производительность?

Структура моего запроса:

match (filter by language),
lookup (col1 join)
lookup (col2 join)
project,
sort

Я использую Пн go 4.0

РЕДАКТИРОВАТЬ:

На самом деле, операции в конвейере могут использовать индекс или нет? Я слышал, что только $ eq может использовать индексы, другие не могут. Это правда ???

Заранее спасибо!

1 Ответ

0 голосов
/ 03 марта 2020
{$lookup:
 {
   from: <collection to join>,
   localField: <field from the input documents>,
   foreignField: <field from the documents of the "from" collection>,
   as: <output array field>
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...