У меня есть запрос, который использует функцию конвейера $ 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 может использовать индексы, другие не могут. Это правда ???
Заранее спасибо!