sql >> Databasteknik >  >> NoSQL >> MongoDB

Frågar kapslade objektmatriser

Du kan använda mongoose-mpath paket för att skapa trädhierarki.

Här är stegen:

1-) Skapa ett kategorischema med detta 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-) posta rutt för att infoga 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);
});

Använd den här rutten och skapa kategorierna med postman:

Rotkategori:(det är bra att ha en ROTkategori, roten har ingen förälder)

{
    "name": "ROOT"
}

Svaret kommer att vara så här:(som du ser har detta plugin lagt till ett sökvägsfält internt för att upprätthålla hierarkin)

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

Cat1-kategori:(observera att vi ställer in det överordnade fältet till rotkategori-id som är 5dd95adf997fc53e1ce944a7)

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

Resultat för Cat1:

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

Cat11-kategori:(observera att vi ställer in överordnat fält till Cat1-id som är 5dd95adf997fc53e1ce944a7)

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

Resultat för Cat11:

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

Och för att hitta en kategori efter namn kan du använda följande get-rutt:(Jag hårdkodade kategorinamn för enkelhets skull, du kan ta kategorinamn från req.body eller req.query)

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

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

Detta kommer att returnera Cat11-kategoridokumentet så här:

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

Och om du vill få barnkategorierna för den hittade kategorin kan du prova mongoose-mpath metoder som getChildrenTree.



  1. MongoDB en till många relation

  2. Hur grupperar och väljer man dokument motsvarande max inom varje grupp i MongoDB?

  3. 504-fel vid infogning i mongo-databasen

  4. Autentiseringsfel vid åtkomst till mongodb via Spring Boot-appen