MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Interroger des tableaux d'objets imbriqués

Vous pouvez utiliser mongoose-mpath package pour créer une arborescence.

Voici les étapes :

1-) Créez un schéma de catégorie à l'aide de ce 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 pour insérer des catégories avec hiérarchie :

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

En utilisant cette route, créez les catégories avec le facteur :

Catégorie racine :(c'est bien d'avoir une catégorie ROOT, la racine n'a pas de parent)

{
    "name": "ROOT"
}

La réponse sera comme ceci :(comme vous le voyez, ce plugin a ajouté un champ de chemin en interne pour maintenir la hiérarchie)

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

Catégorie Cat1 :(notez que nous définissons le champ parent sur l'ID de catégorie racine qui est 5dd95adf997fc53e1ce944a7)

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

Résultat pour Cat1 :

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

Catégorie Cat11 :(notez que nous définissons le champ parent sur l'identifiant Cat1 qui est 5dd95adf997fc53e1ce944a7)

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

Résultat pour Cat11 :

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

Et pour trouver une catégorie par son nom, vous pouvez utiliser la route get suivante :(j'ai codé en dur le nom de la catégorie pour plus de simplicité, vous pouvez prendre le nom de la catégorie à partir de req.body ou req.query)

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

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

Cela vous renverra le document de catégorie Cat11 comme ceci :

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

Et si vous voulez obtenir les catégories enfants de la catégorie trouvée, vous pouvez essayer mongoose-mpath des méthodes comme getChildrenTree.