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

Interrogazione di array di oggetti nidificati

Puoi utilizzare mongoose-mpath pacchetto per creare una gerarchia ad albero.

Ecco i passaggi:

1-) Crea uno schema di categoria usando questo 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 route per inserire categorie con gerarchia:

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

Utilizzando questo percorso, crea le categorie con postino:

Categoria radice:(è bene avere una categoria ROOT, la radice non ha un genitore)

{
    "name": "ROOT"
}

La risposta sarà così:(come vedi questo plugin ha aggiunto un campo di percorso internamente per mantenere la gerarchia)

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

Categoria Cat1:(nota che impostiamo il campo padre sull'ID della categoria radice che è 5dd95adf997fc53e1ce944a7)

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

Risultato per Cat1:

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

Categoria Cat11:(nota che impostiamo il campo padre sull'ID Cat1 che è 5dd95adf997fc53e1ce944a7)

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

Risultato per Cat11:

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

E per trovare una categoria in base al nome, puoi utilizzare il seguente percorso get:(Ho codificato il nome della categoria per semplicità, puoi prendere il nome della categoria da req.body o req.query)

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

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

Questo ti restituirà il documento di categoria Cat11 in questo modo:

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

E se vuoi ottenere le categorie bambini della categoria trovata, puoi provare mongoose-mpath metodi come getChildrenTree.