MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Abfragen von verschachtelten Objekt-Arrays

Sie können mongoose-mpath verwenden Paket zum Erstellen einer Baumhierarchie.

Hier sind die Schritte:

1-) Erstellen Sie ein Kategorieschema mit diesem 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-) Postroute zum Einfügen von Kategorien mit Hierarchie:

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

Erstellen Sie auf dieser Route die Kategorien mit postman:

Root-Kategorie:(es ist gut, eine ROOT-Kategorie zu haben, Root hat keine Eltern)

{
    "name": "ROOT"
}

Die Antwort sieht so aus:(Wie Sie sehen, hat dieses Plugin intern ein Pfadfeld hinzugefügt, um die Hierarchie aufrechtzuerhalten)

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

Cat1-Kategorie:(Beachten Sie, dass wir das übergeordnete Feld auf die Root-Kategorie-ID setzen, die 5dd95adf997fc53e1ce944a7 ist)

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

Ergebnis für Cat1:

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

Cat11-Kategorie:(Beachten Sie, dass wir das übergeordnete Feld auf die Cat1-ID festgelegt haben, die 5dd95adf997fc53e1ce944a7 ist)

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

Ergebnis für Cat11:

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

Und um eine Kategorie anhand des Namens zu finden, können Sie die folgende Get-Route verwenden:(Ich habe den Kategorienamen der Einfachheit halber fest codiert, Sie können den Kategorienamen aus req.body oder req.query nehmen)

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

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

Dadurch erhalten Sie das Cat11-Kategoriedokument wie folgt zurück:

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

Und wenn Sie die untergeordneten Kategorien der gefundenen Kategorie erhalten möchten, können Sie es mit mongoose-mpath versuchen Methoden wie getChildrenTree.