Индексирование по нескольким полям в mongoDB

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

Объект 1:

  • Название: "Шкаф № 1"
  • Тип: "Шкаф"
  • Материал: "Дерево"
  • размеры: "12X15"
  • построено на: "2 октября 2014"
  • id: 12212

Объект 2:

  • имя: "Томми"
  • тип: "домашнее животное"
  • владелец: "Томь"
  • родился: "1 июня 2010 года"
  • id: 12321

Таким образом, каждый объект может иметь разные атрибуты / поля. Я хотел бы иметь возможность запрашивать эту базу данных путем фильтрации по любой комбинации атрибутов. Поскольку база данных может быть огромной, я бы хотел, чтобы поиск данных был быстрым, для чего я хотел бы, чтобы была возможна какая-то индексация, которая ускоряет запрос.

Пример запроса может быть:

  • Поиск всех записей, которые имеют материал = "Дерево" и тип = "Таблица"
  • Поиск всех записей, которые имеют type = "Dog" и owner = "Harry"

Я думал об использовании коллекции, где все атрибуты могут вписываться в один объект, но не вижу, как индексация будет возможна. Очевидно, я могу разбить объект на отдельные атрибутные объекты и затем сохранить его, что будет означать что-то вроде этого:

Объект 1 имеет несколько отдельных объектов:

  • {"attr_name": "name", "attr_value": "Шкаф № 1", "id": 12212}
  • {"attr_name": "type", "attr_value": "Шкаф", "id": 12212}
  • {"attr_name": "material", "attr_value": "Wood", "id": 12212}
  • {"attr_name": "размеры", "attr_value": "12X15", "id": 12212}
  • {"attr_name": "встроенный", "attr_value": "2 октября 2014", "id": 12212 }

Теперь я могу создать индекс для attr_name и получить 'id', который я могу использовать, чтобы собрать все записи для этого объекта. Однако это не будет работать за пределами одного атрибута, в то время как мое требование состоит в том, чтобы фильтровать несколько атрибутов в одном запросе.

Я хотел бы, чтобы некоторые, как структурировать весь объект (не разбивая его, как здесь), и все же иметь возможность создавать индексы. Любые подсказки, как это может быть сделано? Как должны решаться подобные проблемы? Есть ли какие-нибудь NOSQL / другие средства для решения таких проблем? Я открыт для использования другой базы данных также, если это как-то служит.

1 ответ

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

https://www.mongodb.com/blog/post/retail-reference-architecture-part-1-building-flexible-searchable-low-latency-product

Другие вопросы по тегам