Bạn có thể sử dụng mongoose-mpath gói để tạo phân cấp cây.
Dưới đây là các bước:
1-) Tạo lược đồ danh mục bằng cách sử dụng plugin này.
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-) tuyến đường đăng để chèn các danh mục với hệ thống phân cấp:
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);
});
Sử dụng tuyến đường này, tạo các danh mục với người đưa thư:
Danh mục gốc:(tốt là nên có danh mục ROOT, gốc không có cha)
{
"name": "ROOT"
}
Phản hồi sẽ như thế này:(như bạn thấy plugin này đã thêm một trường đường dẫn vào nội bộ để duy trì thứ bậc)
{
"_id": "5dd95adf997fc53e1ce944a7",
"name": "ROOT",
"path": "5dd95adf997fc53e1ce944a7",
"__v": 0
}
Danh mục cat1:(lưu ý rằng chúng tôi đặt trường mẹ thành id danh mục gốc là 5dd95adf997fc53e1ce944a7)
{
"name": "Cat1",
"parent": "5dd95adf997fc53e1ce944a7"
}
Kết quả cho Cat1:
{
"_id": "5dd95b21997fc53e1ce944a8",
"name": "Cat1",
"parent": "5dd95adf997fc53e1ce944a7",
"path": "5dd95adf997fc53e1ce944a7#5dd95b21997fc53e1ce944a8",
"__v": 0
}
Danh mục Cat11:(lưu ý rằng chúng tôi đặt trường mẹ thành id Cat1 là 5dd95adf997fc53e1ce944a7)
{
"name": "Cat11",
"parent": "5dd95adf997fc53e1ce944a7"
}
Kết quả cho Cat11:
{
"_id": "5dd95b8e997fc53e1ce944aa",
"name": "Cat11",
"parent": "5dd95adf997fc53e1ce944a7",
"path": "5dd95adf997fc53e1ce944a7#5dd95b8e997fc53e1ce944aa",
"__v": 0
}
Và để tìm danh mục theo tên, bạn có thể sử dụng đường lấy sau:(Tôi đặt tên danh mục được mã hóa cứng để đơn giản, bạn không thể lấy tên danh mục từ req.body hoặc req.query)
router.get("/", async (req, res) => {
let category = await Category.findOne({
name: "Cat11"
});
res.status(200).send(category);
});
Thao tác này sẽ trả lại cho bạn tài liệu danh mục Cat11 như sau:
{
"_id": "5dd95b8e997fc53e1ce944aa",
"name": "Cat11",
"parent": "5dd95adf997fc53e1ce944a7",
"path": "5dd95adf997fc53e1ce944a7#5dd95b8e997fc53e1ce944aa",
"__v": 0
}
Và nếu bạn muốn lấy các danh mục con của danh mục được tìm thấy, bạn có thể thử mongoose-mpath
các phương thức như getChildrenTree.