Предположим, у меня есть очень большая база данных MongoDB, в которой каждый элемент имеет массив встроенных документов variants
.
{
_id: 1,
item: "item1",
variants: [
{ type: "type1" },
{ type: "type2" }
]
}
{
_id: 2,
item: "item2",
variants: [
{ type: "type1" },
{ type: "type3" }
]
}
...
Моя цель - сгладить разбитую на страницы таблицу и иметь возможность сортировать каждый столбец.
Таблица разбитая на страницы с разбивкой по типу варианта:
_id ↕ | item ↕ | type ↕
-------+--------+--------
1 | item1 | type1
2 | item2 | type1
1 | item1 | type2
2 | item2 | type3
...
< (1),2,3,4,5 ... 54323 >
Мой подход заключается в получении подмножества для каждой страницы разбивки на страницы с использованием конвейера агрегации MonogoDB
db.items.aggregate([
$unwind: {
path: '$variants.type',
includeArrayIndex: 'variant_index'
},
$sort: {
'variants.type': 1
}, {
$skip: 0
}, {
$limit: 50
}
])
К сожалению длябольшие наборы данных, это очень дорогая операция сортировки, которая может даже привести в моей конкретной реализации к ошибке Sort exceeded memory limit of 104857600 bytes
.
У меня вопрос: возможно ли оптимизировать это для хорошей производительности, не перемещая данные вариантов в отдельную коллекцию (что невозможно).Я думал об использовании «индексов нескольких клавиш», но не могу понять, как их можно использовать здесь.