Фильтрация MongoDB по многим параметрам (составной индекс или нет)
-
29-10-2019 - |
Вопрос
У меня есть каталог товаров, и я хочу отфильтровать его по многим параметрам: категория, цена, размер, цвет, вес и т. д.
Итак, вопрос в индексации.
Я могу попробовать использовать составной индекс для всех полей и запрашивать их в том же порядке, в котором я их проиндексировал. Но что, если мне нужно отфильтровать только по размеру и цвету, а потом только по цене и весу? Создание составного индекса для каждого возможного запроса фильтрации было бы излишним, потому что могло бы быть слишком много параметров.
Итак, после некоторого поиска я нашел интересный подход а>
Здесь предлагается использовать «нормализованные атрибуты»:
родовое словои теперь запись mongo будет выглядеть так:
родовое словоЗатем я должен индексировать по атрибутам, и после этого я могу запросить следующим образом:
родовое словоПреимущества:
- меньшие индексы
- более быстрый поиск
- любое количество параметров
- легко растет
Я не понял, как мне получить эти числа для каждого атрибута? Они как-то рассчитываются (как md5)? Или мне следует создать другую коллекцию и хранить в ней каждое значение ключа? И сначала получить числа оттуда - каждый раз, когда мне нужно отфильтровать коллекцию «предметов»?
А что вы думаете об этом подходе?
ОБНОВЛЕНИЕ: Что, если я буду использовать составные строки вместо чисел?
родовое словоРешение
Поиск (эффективный) в каталоге магазина - действительно нетривиальная задача.
Да, вы можете создать дополнительную коллекцию и хранить там все значения
родовое словоНет, вам не нужно каждый раз повторно запрашивать эту коллекцию.Размер данных здесь, скорее всего, будет небольшим, поэтому вы можете кэшировать их в процессе приложения.Не забывайте подсказку: всегда сначала ставьте атрибут с наименьшей мощностью.
Другой подход - использовать битовую маску, но поскольку MongoDB имеет ограниченную целочисленную длину, вы не можете получить неограниченное количество атрибутов.