Есть следующий набор данных:
1.
Бренд (Бренды предоставляющие сервисы. Один бренд может иметь много сервисов.)
2.
Сервисы (Сервисы представляющиеся брендами. Один сервис может принадлежать к нескольким брендам. Один сервис может иметь несколько пакетов услуг.)
3.
Пакеты (Пакеты услуг входящие в сервис. Один пакет может принадлежать нескольким сервисам. Каждый пакет может иметь много Опций.)
4.
Опции (Опции входящие в пакет услуг. Одна опция может принадлежать нескольким Пакетам.)
То есть ситуация такая:
1.
Бренд - Сервис (один ко многим)
2.
Сервис - Пакеты (многие ко многим)
3.
Пакеты - Опции (многие ко многим)
В приложении есть страница "Бренда", на которой нужно построить полную цепочку связей сверху в низ:
1. Инфо о бренде
2. Какие сервисы содержит этот бренд
3. Какие пакеты содержат сервисы у этого бренда
4. Какие опции содержат пакеты, которые содержат сервисы этого бренда.
И наоборот, есть страница "Опции", которая должна описывать всю лестницу связей с низу вверх:
1. Какие пакеты содержат эту опцию
2. Какие сервисы содержат пакеты, содержащие эту опцию.
3. Какие бренды содержат сервисы у которых есть пакеты с этой опцией.
То есть лестничная структура связей:
Бренд -> Сервисы -> Пакеты -> Опции;
Планирую использовать ссылки на Модели таким образом:
const brandSchema = new Schema({
name: { type: String, required: true},
services: [{ type: mongoose.Types.ObjectId, ref: 'Service' }]
});
const serviceSchema = new Schema({
name: { type: String, required: true},
brands: [{ type: mongoose.Types.ObjectId, ref: 'Brand' }],
packages: [{ type: mongoose.Types.ObjectId, ref: 'Package' }]
});
const packageSchema = new Schema({
name: { type: String, required: true},
services: [{ type: mongoose.Types.ObjectId, ref: 'Service' }],
options: [{ type: mongoose.Types.ObjectId, ref: 'Option' }]
});
const optionSchema = new Schema({
name: { type: String, required: true},
packages: [{ type: mongoose.Types.ObjectId, ref: 'Package' }]
});
То есть вытащить ближайшие (соседние) связи. Например, по ссылкам в Модели "Пакета" можно найти к каким сервисам он принадлежит и какие "Опции" имеет этот пакет. Если явно указать ссылки на эти типы в модели Пакета:
const packageSchema = new Schema({
name: { type: String, required: true},
services: [{ type: mongoose.Types.ObjectId, ref: 'Service' }],
options: [{ type: mongoose.Types.ObjectId, ref: 'Option' }]
});
Как узнать: "К какому бренду принадлежит конкретная опция?" То есть, как последняя абстракция данных в цепочках соотносится с первой? БРЕНД --> ПАКЕТ или ПАКЕТ --> БРЕНД Как хранить эти связи? Есть операторы для этих целей Или нужно на клиенте реализовывать эту логику Геттерами из своего локального состояния?