您可以使用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 Category:(有ROOT类就好,root没有父类)
{
"name": "ROOT"
}
响应将是这样的:(如您所见,此插件在内部添加了一个路径字段以维护层次结构)
{
"_id": "5dd95adf997fc53e1ce944a7",
"name": "ROOT",
"path": "5dd95adf997fc53e1ce944a7",
"__v": 0
}
Cat1 类别:(请注意,我们将父字段设置为根类别 id,即 5dd95adf997fc53e1ce944a7)
{
"name": "Cat1",
"parent": "5dd95adf997fc53e1ce944a7"
}
Cat1 的结果:
{
"_id": "5dd95b21997fc53e1ce944a8",
"name": "Cat1",
"parent": "5dd95adf997fc53e1ce944a7",
"path": "5dd95adf997fc53e1ce944a7#5dd95b21997fc53e1ce944a8",
"__v": 0
}
Cat11 类别:(请注意,我们将父字段设置为 Cat1 id,即 5dd95adf997fc53e1ce944a7)
{
"name": "Cat11",
"parent": "5dd95adf997fc53e1ce944a7"
}
Cat11 的结果:
{
"_id": "5dd95b8e997fc53e1ce944aa",
"name": "Cat11",
"parent": "5dd95adf997fc53e1ce944a7",
"path": "5dd95adf997fc53e1ce944a7#5dd95b8e997fc53e1ce944aa",
"__v": 0
}
要按名称查找类别,您可以使用以下 get 路线:
(为简单起见,我对类别名称进行了硬编码,您可以从 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-mpathgetChildrenTree之类的方法。