Индексирование по нескольким полям в 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 имеет справочную статью по архитектуре для розничной реализации, которая отражает проблему, которую вы пытаетесь решить. В нем также говорится об индексации и отображении многогранного поиска на основе запроса вариантов атрибутов. Я полагаю, вы найдете там очень важную информацию и хорошую отправную точку для решения вашей проблемы: