У меня есть две схемы:
Навыки:
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
документе?
Вам нужно 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 });
});