Похоже, что с вашей текущей моделью данных вам нужно будет извлечь документ верхнего уровня, а затем рекурсивно искать нужный объект внутри документа, который вы получили.
Существует много способов хранения иерархических данных, и я бы посоветовал вам взглянуть на документы 10gen здесь , они довольно тщательные, но я кратко изложу для вас ниже.
Давайте рассмотрим некоторые идеи, представленные в этом документе, начиная с хороших частей и недостатков вашего текущего подхода.
Полное дерево в одном документе (что вы делаете сейчас)
- Плюсы:
- Один документ для загрузки на страницу
- Одно место на диске для всего дерева
- Вы можете легко увидеть полную структуру
- Cons
- Трудно найти
- Трудно вернуть частичные результаты
- Может стать громоздким, если вам нужно огромное дерево. Кроме того, существует ограничение на размер документов в MongoDB - 16 МБ в версии 1.8 (ограничение может увеличиться в будущих версиях).
Ваш вопрос имеет непосредственное отношение к проблеме поиска, поэтому, в зависимости от вашего варианта использования и желания оптимизировать, вы, вероятно, либо захотите взять массив предков или Материализованный путь подход вместо.
Массив Предков
При таком подходе вы сохраняете предков документа в массиве и создаете индекс для этого поля, чтобы его можно было легко и быстро найти.
Материализованный путь
При таком подходе вы сохраняете полный путь к документу в виде строки предков и запросов с помощью регулярного выражения.
Имеет смысл?