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

1

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

Навыки:

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.log("clearing user ID from skills model");
    await Skills.remove({associatedUsers: { $in: this._id } });

});

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

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

Теги:
mongoose

1 ответ

2

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню