Можете да използвате mongoose-mpath пакет за създаване на дървовидна йерархия.
Ето стъпките:
1-) Създайте схема на категория с помощта на този плъгин.
const mongoose = require("mongoose");
const MpathPlugin = require("mongoose-mpath");
const schema = new mongoose.Schema({
name: {
type: String,
required: true
}
});
schema.plugin(MpathPlugin);
const Category = mongoose.model("Category", schema);
module.exports = { Category };
2-) публикувайте маршрут за вмъкване на категории с йерархия:
const express = require("express");
const router = express.Router();
const { Category } = require("../models/category");
router.post("/", async (req, res) => {
const { name, parent } = req.body;
const category = await Category.create({ name, parent });
res.status(201).send(category);
});
Използвайки този маршрут, създайте категориите с пощальон:
Основна категория:(добре е да имате ROOT категория, root няма родител)
{
"name": "ROOT"
}
Отговорът ще бъде като този:(както виждате, този плъгин добави вътрешно поле за път, за да поддържа йерархия)
{
"_id": "5dd95adf997fc53e1ce944a7",
"name": "ROOT",
"path": "5dd95adf997fc53e1ce944a7",
"__v": 0
}
Категория Cat1:(обърнете внимание, че задаваме родителското поле на идентификатора на основната категория, който е 5dd95adf997fc53e1ce944a7)
{
"name": "Cat1",
"parent": "5dd95adf997fc53e1ce944a7"
}
Резултат за Cat1:
{
"_id": "5dd95b21997fc53e1ce944a8",
"name": "Cat1",
"parent": "5dd95adf997fc53e1ce944a7",
"path": "5dd95adf997fc53e1ce944a7#5dd95b21997fc53e1ce944a8",
"__v": 0
}
Категория Cat11:(обърнете внимание, че задаваме родителско поле на идентификатора на Cat1, който е 5dd95adf997fc53e1ce944a7)
{
"name": "Cat11",
"parent": "5dd95adf997fc53e1ce944a7"
}
Резултат за Cat11:
{
"_id": "5dd95b8e997fc53e1ce944aa",
"name": "Cat11",
"parent": "5dd95adf997fc53e1ce944a7",
"path": "5dd95adf997fc53e1ce944a7#5dd95b8e997fc53e1ce944aa",
"__v": 0
}
И за да намерите категория по име, можете да използвате следния маршрут за получаване:(твърдо кодирах име на категория за простота, можете да вземете име на категория от req.body или req.query)
router.get("/", async (req, res) => {
let category = await Category.findOne({
name: "Cat11"
});
res.status(200).send(category);
});
Това ще ви върне документа за категория Cat11 по следния начин:
{
"_id": "5dd95b8e997fc53e1ce944aa",
"name": "Cat11",
"parent": "5dd95adf997fc53e1ce944a7",
"path": "5dd95adf997fc53e1ce944a7#5dd95b8e997fc53e1ce944aa",
"__v": 0
}
И ако искате да получите детските категории на намерената категория, можете да опитате mongoose-mpath
методи като getChildrenTree.