MongoDB предлагает несколько стратегий для хранения иерархических данных (например, деревья категорий). Каждая имеет свои компромиссы в зависимости от твоих приоритетов чтения/записи.
Каждый документ хранит ссылку на свой родительский узел.
$graphLookupКаждый документ хранит массив ID прямых потомков.
Каждый документ хранит полный путь от корня до себя в виде строки (например, "/electronics/phones/smartphones").
Каждый узел хранит левую и правую границы в виде целых чисел, представляющих его позицию в дереве.
$graphLookupВстроенный оператор агрегации MongoDB для рекурсивного обхода документов.
$graphLookup: {
from: "categories",
startWith: "$_id",
connectFromField: "_id",
connectToField: "parentId",
as: "subtree"
}
| Стратегия | Скорость чтения | Скорость записи | Лучше всего для |
|---|---|---|---|
| Ссылка на родителя | Медленно (глубоко) | Быстро | Частые обновления |
| Материализованный путь | Быстро | Средне | Нагруженные чтением деревья |
| Вложенное множество | Быстрее всего | Медленно | Статические данные |
$graphLookup | Средне | N/A | Гибкий обход |
Модель Nested Set использует левые и правые граничные целые числа для представления позиций в дереве, что делает её самым быстрым подходом как для запросов поддеревьев, так и для запросов предков, но становится запретительно дорогой, когда узлы часто перемещаются или переструктурируются.
Новый — ещё не проверен сообществом
Вы