MongoDB нумерация страниц с помощью $ unwind и sort - PullRequest
3 голосов
/ 27 марта 2019

Предположим, у меня есть очень большая база данных 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.

У меня вопрос: возможно ли оптимизировать это для хорошей производительности, не перемещая данные вариантов в отдельную коллекцию (что невозможно).Я думал об использовании «индексов нескольких клавиш», но не могу понять, как их можно использовать здесь.

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