Обновление двух коллекций одновременно
У меня есть 2 коллекции. Одна состоит из данных, где хранятся категории, а другая коллекция с тегами. По задумке, я должен реализовать поиск по сайту по тегам(снизу скриншот). Я добавляю в одну коллекцию категории, где хранятся сами категории и их id. Далее я создаю тег, где подгружаю список этих категорий(скриншот 2). После выбора нужных категорий я передаю данные на сервер, где их и обрабатываю:
const Category = require('../models/category.model')
const Tag = require('../models/tag.model')
const slugify = require('slugify')
module.exports.createTag = async (req, res) => {
try {
const tag = new Tag({
premium: req.body.premium,
categories: req.body.categories,
category: req.body.category,
title: req.body.title,
tag: slugify(req.body.title),
description: req.body.description,
name: req.body.name
})
await tag.save()
}
Сохранение данных в бд идет по такой модели:
const {Schema, model} = require('mongoose')
const tagSchema = new Schema({
title: {
type: String,
required: true
},
category: {
type: String,
required: true
},
tag: {
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 {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)
Категории связаны через refs. Теперь нужно сохранить в коллекции категорий, а именно, в категорию/категории которую/ые я выбрал при создании тега, айди самого тега. Вот как я это делаю:
module.exports.createTag = async (req, res) => {
try {
const tag = new Tag({
premium: req.body.premium,
categories: req.body.categories,
category: req.body.category,
title: req.body.title,
tag: slugify(req.body.title),
description: req.body.description,
name: req.body.name
})
//Сохранение самого тега в бд
await tag.save()
// Сохранение в тега в бд категорий
req.body.categories.forEach(async item => {
const category = await Category.findById(item._id)
category.tags.push(tag._id)
await category.save()
})
}
Перебираю массив, т.к. выбранных категорий может быть как одна, так и больше.
Все работает. При удалении тега, в категориях он автоматически удаляется. Но если я обновляю сам тег, то есть делаю другой выбор категорий, например, вместо собачек выбираю котиков и сохраняю, то сами данные обновляются(собачек категории нет при загрузке, а котики сохранились), а вот в категориях, которые я убрал, сам тег не убирается.
Вот сохранение данных:
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}
)
}

