Предварительный хук Mongoose: вытащить _id из массива при удалении

У меня есть две схемы:

Навыки и умения:

var mongoose = require("mongoose");

var SkillSchema = new mongoose.Schema({
    skill: { type: String },
    tally: { type: Number, default: 0 },
    associatedUsers: { type: Array },
});

module.exports = mongoose.model("Skills", SkillSchema);

Профиль:

var mongoose = require("mongoose");
var passportLocalMongoose = require("passport-local-mongoose");

var profileSchema = new mongoose.Schema({ 
    username: String,
    password: String,
    skills: { type: Array }
    }
);

profileSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model("Profile", profileSchema);

Документ Skills содержит навыки, связанные с различными users (Skills. Skills.associatedUsers):

{
    "_id" : ObjectId("5cab5c8788368eafb68b75a4"),
    "skill" : "cooking",
    "__v" : 0,
    "associatedUsers" : [
        ObjectId("5cab5c7d88368eafb68b75a0"),
        ObjectId("5cab546a7fb2b3a71c0404fa")
    ],
    "tally" : 0
}

И документ Profile содержит набор навыков:

{
    "_id" : ObjectId("5cab546a7fb2b3a71c0404fa"),
    "skills" : [
        "cooking", "cleaning"
    ],
    "__v" : 0,
    "username" : "deleteMe"
}

Я пытаюсь реализовать предварительный хук в схеме Profile, чтобы при удалении пользователя любой экземпляр user._id в Skills.associatedUsers также удалялся.

Я пробовал следующее, но на самом деле он удаляет всю запись для этого навыка:

const Skills = require("./skills");


profileSchema.pre('remove', async function(){
    console.info("clearing user ID from skills model");
    await Skills.remove({associatedUsers: { $in: this._id } });

});

module.exports = mongoose.model("Profile", profileSchema);

Как я могу pull._id удаляемого пользователя из массива associatedUsers в документе Skills?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
412
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно update с оператором $тянуть и указать multi: true, чтобы удалить это значение из всех документов в коллекции profile:

profileSchema.pre('remove', async function(){
    console.info("clearing user ID from skills model");
    await Skills.update({}, { $pull: { associatedUsers: { $in: this._id } } }, { multi: true });
});

Другие вопросы по теме