sql >> Database teknologi >  >> NoSQL >> MongoDB

Forespørger om indlejrede objektarrays

Du kan bruge mongoose-mpath pakke for at skabe træhierarki.

Her er trinene:

1-) Opret et kategoriskema ved hjælp af dette plugin.

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-) post rute for at indsætte kategorier med hierarki:

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);
});

Brug denne rute til at oprette kategorierne med postbud:

Root Kategori:(det er godt at have en ROT-kategori, root har ingen forælder)

{
    "name": "ROOT"
}

Svaret vil være som dette:(som du ser, tilføjede dette plugin et stifelt internt for at opretholde hierarki)

{
    "_id": "5dd95adf997fc53e1ce944a7",
    "name": "ROOT",
    "path": "5dd95adf997fc53e1ce944a7",
    "__v": 0
}

Cat1-kategori:(bemærk, at vi sætter overordnet felt til rodkategori-id'et, som er 5dd95adf997fc53e1ce944a7)

{
    "name": "Cat1",
    "parent": "5dd95adf997fc53e1ce944a7"
}

Resultat for Cat1:

{
    "_id": "5dd95b21997fc53e1ce944a8",
    "name": "Cat1",
    "parent": "5dd95adf997fc53e1ce944a7",
    "path": "5dd95adf997fc53e1ce944a7#5dd95b21997fc53e1ce944a8",
    "__v": 0
}

Cat11-kategori:(bemærk, at vi indstiller overordnet felt til Cat1-id'et, som er 5dd95adf997fc53e1ce944a7)

{
    "name": "Cat11",
    "parent": "5dd95adf997fc53e1ce944a7"
}

Resultat for Cat11:

{
    "_id": "5dd95b8e997fc53e1ce944aa",
    "name": "Cat11",
    "parent": "5dd95adf997fc53e1ce944a7",
    "path": "5dd95adf997fc53e1ce944a7#5dd95b8e997fc53e1ce944aa",
    "__v": 0
}

Og for at finde en kategori efter navn, kan du bruge følgende get-rute:(Jeg har hårdt kodet kategorinavn for nemheds skyld, du kan tage kategorinavn fra req.body eller req.query)

router.get("/", async (req, res) => {
  let category = await Category.findOne({
    name: "Cat11" 
  });

  res.status(200).send(category);
});

Dette vil returnere Cat11 kategoridokumentet som dette:

{
    "_id": "5dd95b8e997fc53e1ce944aa",
    "name": "Cat11",
    "parent": "5dd95adf997fc53e1ce944a7",
    "path": "5dd95adf997fc53e1ce944a7#5dd95b8e997fc53e1ce944aa",
    "__v": 0
}

Og hvis du vil have børnekategorierne for den fundne kategori, kan du prøve mongoose-mpath metoder som getChildrenTree.



  1. Mocking/stubbing Mongoose model spare metode

  2. Mongoengine creation_time attribut i dokument

  3. mongodb aggregeringsramme - generer _id fra funktion

  4. node.js mongodb hvordan man opretter forbindelse til replicaset af mongo-servere