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);
});
このルートを使用して、postmanでカテゴリを作成します:
ルートカテゴリ:(ルートカテゴリがあるのは良いことですが、ルートには親がありません)
{
"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カテゴリ:(親フィールドを5dd95adf997fc53e1ce944a7であるCat1IDに設定していることに注意してください)
{
"name": "Cat11",
"parent": "5dd95adf997fc53e1ce944a7"
}
Cat11の結果:
{
"_id": "5dd95b8e997fc53e1ce944aa",
"name": "Cat11",
"parent": "5dd95adf997fc53e1ce944a7",
"path": "5dd95adf997fc53e1ce944a7#5dd95b8e997fc53e1ce944aa",
"__v": 0
}
また、名前でカテゴリを検索するには、次のget routeを使用できます:(簡単にするためにカテゴリ名をハードコーディングしました。カテゴリ名は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のようなメソッド。