Фильтрация MongoDB по многим параметрам (составной индекс или нет)

StackOverflow https://stackoverflow.com/questions/9390307

Вопрос

У меня есть каталог товаров, и я хочу отфильтровать его по многим параметрам: категория, цена, размер, цвет, вес и т. д.

Итак, вопрос в индексации.

Я могу попробовать использовать составной индекс для всех полей и запрашивать их в том же порядке, в котором я их проиндексировал. Но что, если мне нужно отфильтровать только по размеру и цвету, а потом только по цене и весу? Создание составного индекса для каждого возможного запроса фильтрации было бы излишним, потому что могло бы быть слишком много параметров.

Итак, после некоторого поиска я нашел интересный подход

Здесь предлагается использовать «нормализованные атрибуты»:

родовое слово

и теперь запись mongo будет выглядеть так:

родовое слово

Затем я должен индексировать по атрибутам, и после этого я могу запросить следующим образом:

родовое слово

Преимущества:

  • меньшие индексы
  • более быстрый поиск
  • любое количество параметров
  • легко растет

Я не понял, как мне получить эти числа для каждого атрибута? Они как-то рассчитываются (как md5)? Или мне следует создать другую коллекцию и хранить в ней каждое значение ключа? И сначала получить числа оттуда - каждый раз, когда мне нужно отфильтровать коллекцию «предметов»?

А что вы думаете об этом подходе?

ОБНОВЛЕНИЕ: Что, если я буду использовать составные строки вместо чисел?

родовое слово
Это было полезно?

Решение

Поиск (эффективный) в каталоге магазина - действительно нетривиальная задача.

Да, вы можете создать дополнительную коллекцию и хранить там все значения

родовое слово

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

Другой подход - использовать битовую маску, но поскольку MongoDB имеет ограниченную целочисленную длину, вы не можете получить неограниченное количество атрибутов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top