sql >> Database >  >> NoSQL >> MongoDB

Query's uitvoeren op geneste objectarrays

U kunt mongoose-mpath gebruiken pakket om een ​​boomhiërarchie te maken.

Dit zijn de stappen:

1-) Maak een categorieschema met deze plug-in.

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 route om categorieën met hiërarchie in te voegen:

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

Maak met behulp van deze route de categorieën met postbode:

Root-categorie:(het is goed om een ​​ROOT-categorie te hebben, root heeft geen ouder)

{
    "name": "ROOT"
}

Het antwoord is als volgt:(zoals je ziet heeft deze plug-in intern een padveld toegevoegd om de hiërarchie te behouden)

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

Cat1-categorie:(merk op dat we het bovenliggende veld instellen op de rootcategorie-ID die 5dd95adf997fc53e1ce944a7 is)

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

Resultaat voor Cat1:

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

Cat11-categorie:(merk op dat we het bovenliggende veld instellen op de Cat1-id die 5dd95adf997fc53e1ce944a7 is)

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

Resultaat voor Cat11:

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

En om een ​​categorie op naam te vinden, kunt u de volgende get-route gebruiken:(Ik heb de categorienaam voor de eenvoud hard gecodeerd, u kunt de categorienaam uit req.body of req.query nemen)

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

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

Hiermee krijgt u het Cat11-categoriedocument als volgt terug:

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

En als u de onderliggende categorieën van de gevonden categorie wilt krijgen, kunt u mongoose-mpath proberen methoden zoals getChildrenTree.



  1. hasMany-relatieprobleem in Laravel 5.3 + MongoDB-bibliotheek 'jenssegers/laravel-mongodb'

  2. rangschikkingsbord in mongo met omringende spelers

  3. NodeJs - Redis gebruiken, connect-redis met express

  4. Waarom zou ik Redis gebruiken als ik PostgreSQL als mijn database voor Django heb?