MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Consultando arrays de objetos aninhados


Você pode usar mongoose-mpath pacote para criar hierarquia de árvore.

Aqui estão os passos:

1-) Crie um esquema de categoria usando este 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-) postar rota para inserir categorias com hierarquia:
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 rota, crie as categorias com o carteiro:

Categoria Raiz:(é bom ter uma categoria RAIZ, a raiz não tem pai)
{
    "name": "ROOT"
}

A resposta será assim:(como você vê este plugin adicionou um campo de caminho internamente para manter a hierarquia)
{
    "_id": "5dd95adf997fc53e1ce944a7",
    "name": "ROOT",
    "path": "5dd95adf997fc53e1ce944a7",
    "__v": 0
}

Cat1 category:(observe que definimos o campo pai para o ID da categoria raiz, que é 5dd95adf997fc53e1ce944a7)
{
    "name": "Cat1",
    "parent": "5dd95adf997fc53e1ce944a7"
}

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

Categoria Cat11:(observe que definimos o campo pai para o ID Cat1 que é 5dd95adf997fc53e1ce944a7)
{
    "name": "Cat11",
    "parent": "5dd95adf997fc53e1ce944a7"
}

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

E para encontrar uma categoria pelo nome, você pode usar a seguinte rota de obtenção:(Eu codifiquei o nome da categoria para simplificar, você pode pegar o nome da categoria de req.body ou req.query)
router.get("/", async (req, res) => {
  let category = await Category.findOne({
    name: "Cat11" 
  });

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

Isso retornará o documento da categoria Cat11 assim:
{
    "_id": "5dd95b8e997fc53e1ce944aa",
    "name": "Cat11",
    "parent": "5dd95adf997fc53e1ce944a7",
    "path": "5dd95adf997fc53e1ce944a7#5dd95b8e997fc53e1ce944aa",
    "__v": 0
}

E se você quiser obter as categorias filhas da categoria encontrada, tente mongoose-mpath métodos como getChildrenTree.