sql >> データベース >  >> NoSQL >> MongoDB

ネストされたオブジェクト配列のクエリ

    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のようなメソッド。



    1. MongoDB forEach()

    2. Meteor-可能な限りMeteor.userId()ではなくthis.userIdを使用する必要があるのはなぜですか?

    3. Spring Dataを使用して上限付きコレクションを作成するにはどうすればよいですか? -MongoDB

    4. Mongoose.js:ユーザー名LIKE値でユーザーを検索