One-to-Many. Как проверить и изменить данные при обновлении?

У меня есть две коллекции. Одна содержит несколько категорий, другая множество тегов. Изначально я создаю категории, в которых хранится информация о категории и массив с тегами. Использую mongoose. Две коллекции связаны с помощью refs. При создании тега я подгружаю массив с id категорий и добавляю какой захочу id категории в миссив. Затем сохраняю в базу данных. Сохраняю с помощью вот этого кода:

// Model Category
const { Schema, model } = require("mongoose");
 
const categorieSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  tags: [
    {
      type: Schema.Types.ObjectId,
      ref: "tags"
    }
  ]
});
module.exports = model("categories", categorieSchema);
 
//Model Tags
const { Schema, model } = require("mongoose");
 
const tagSchema = new Schema({
  title: {
    type: String,
    required: true
  },
  category: {
    type: String,
    required: true
  },
  slug: {
    type: String,
    required: true
  },
  name: {
    type: String,
    required: true
  },
  description: {
    type: String,
    required: true
  },
  premium: {
    type: Boolean
  },
  categories: [
    {
      ref: "categories",
      type: Schema.Types.ObjectId
    }
  ]
});
 
module.exports = model("tags", tagSchema);
 
 
// Обработка кода
const Tag = require("../models/tag.model");
const Category = require("../models/category.model");
const slugify = require("slugify");
 
module.exports.create = async (req, res) => {
 
  try {
    const tag = new Tag({
      slug: slugify(req.body.title),
      category: req.body.category,
      categories: req.body.categories,
      name: req.body.name,
      premium: req.body.premium,
      title: req.body.title,
      description: req.body.description
    });
 
    await tag.save();
 
     req.body.categories.forEach(async item => {
       const category = await Category.findById(item._id);
       category.tags.push(tag._id);
       await category.save();
     });
 
    res.status(201).json({ message: "Тег успешно создан" });
  } catch (e) {
    console.log(e);
    res.status(500).json({ message: "Произошла ошибка" });
  }
};

Но при обновлении тега, я хочу либо изменить категорию для тега, либо вообще удалить ее у тега, чтобы сам тег не отображался в категории, которую я хочу удалить. И, если, я добавлю категорию, я хочу чтобы все это обновилось. Как я могу это реализовать? Обработка кода идет следующая:

module.exports.update = async (req, res) => {
  try {
    const $set = {
      premium: req.body.premium,
      category: req.body.category,
      categories: req.body.categories,
      title: req.body.title,
      tag: slugify(req.body.title),
      description: req.body.description,
      name: req.body.name
    };
    
    await Tag.findOneAndUpdate(
      {
        _id: req.params.id
      },
      { $set },
      { new: true }
    );
 
    res.json({ message: "Успешное обновление" });
  } catch (e) {
    res.json({ message: "Ошибка!" });
  }
};

Но я лишь обновляю поля самого тега, но связанная коллекция (categories) никак не изменяется.


Ответы (0 шт):