sql >> Base de Datos >  >> NoSQL >> MongoDB

Consulta de matrices de objetos anidados

Puede usar mongoose-mpath paquete para crear una jerarquía de árbol.

Estos son los pasos:

1-) Cree un esquema de categoría usando este complemento.

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-) ruta de publicación para insertar categorías con jerarquía:

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

Usando esta ruta, cree las categorías con cartero:

Categoría Raíz:(es bueno tener una categoría RAÍZ, la raíz no tiene padre)

{
    "name": "ROOT"
}

La respuesta será así:(como ve, este complemento agregó un campo de ruta internamente para mantener la jerarquía)

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

Categoría Cat1:(tenga en cuenta que establecemos el campo principal en el ID de la categoría raíz, que es 5dd95adf997fc53e1ce944a7)

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

Resultado para Cat1:

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

Categoría Cat11:(tenga en cuenta que configuramos el campo principal en el ID de Cat1, que es 5dd95adf997fc53e1ce944a7)

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

Resultado para Cat11:

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

Y para encontrar una categoría por nombre, puede usar la siguiente ruta de obtención:(Codifiqué el nombre de categoría para simplificar, puede tomar el nombre de categoría de req.body o req.query)

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

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

Esto le devolverá el documento de categoría Cat11 como este:

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

Y si desea obtener las categorías secundarias de la categoría encontrada, puede probar mongoose-mpath métodos como getChildrenTree.