У меня есть 2 схемы. Одна пользовательская схема и схема проекта. Пользовательская схема содержит ссылку на схему проекта. Схема пользователя:
const UserSchema = new Schema({
username: {
type: String,
required: true
},
email: {
type: String,
required: true
},
password: {
type: String,
required: true
},
date: {
type: Date,
default: Date.now
},
projects: [
{
type: Schema.Types.ObjectId,
ref: 'Project'
}
]
});
Схема проекта:
const projectSchema = new Schema({
experience: [
{
company: String,
positionExperience: String,
descriptionExperience: String,
websiteExperience: String,
timeperiodExperience: Array,
}
],
education: [
{
school: String,
degree: String,
descriptionEducation: String,
websiteEducation: String,
timeperiodEducation: Array
},
],
}, {
collection: 'project'
});
Когда вошедший в систему пользователь сохраняет проект, он помещается в массив проектов в схеме пользователя с помощью: user.projects.push(project);
Я получил маршрут удаления, который позволяет пользователю удалять проекты:
router.delete('/delete/:id', passport.authenticate('jwt', { session: false }), (req, res, next) => {
Project.findByIdAndRemove({ _id: req.params.id }, (err) => {
if (err) res.json(err)
else res.json('Succesfully removed')
});
})
Однако идентификаторы проекта не удаляются из коллекции текущего зарегистрированного пользователя в базе данных. Журнал БД:
"_id" : ObjectId("5d9474c2dccfb181dd8e9fde"),
"projects" : [
ObjectId("5d9474cddccfb181dd8e9fdf"),
ObjectId("5d94753e9b610a81f83937e9"),
ObjectId("5d947602f72f0f820f2974f0"),
ObjectId("5d947ae435d2e982535d9a53"),
],
"username" : "b",
"password" : "$2a$10$4T1TjmFYD/01wEdMbiSRMeKNVKegnkVBOGGHasP.qJjVbQzmgEZDO",
"email" : "b",
Все проекты удалены, но их идентификаторы все еще находятся в записи пользователя. Мне нужна какая-то сборка мусора, чтобы удалить их. Я посмотрел на Каскадный Удалить . Каскадное удаление означает, что если запись в родительской таблице будет удалена, то соответствующие записи в дочерней таблице будут автоматически удалены. В моем случае пользователь является родительской таблицей, и я не пытаюсь удалить пользователя, я пытаюсь удалить проект, связанный с пользователем. Я пробовал что-то вроде этого:
User.findOne({ username: req.user.username }, (err, user) => {
Project.remove({
"_id": {
$in: user.projects
}
}, function(err) {
if(err) return next(err);
user.deleteOne()
})
})
Но это удаляет всего пользователя ... Как я могу удалить как проект из коллекции проектов, так и проекты, соответствующие зарегистрированному пользователю? Заранее спасибо.
* ----- РЕДАКТИРОВАНИЕ ----- *
После еще нескольких копаний, и благодаря очень полезным ответам, эточто я придумал:
//delete route
router.delete('/delete/:id', passport.authenticate('jwt', { session: false }), (req, res, next) => {
User.findOneAndUpdate({ username: req.user.username }, {
$pull: {
'projects': req.params.id
}
}, function (err, model) {
if (!err) {
Project.findByIdAndRemove({ _id: req.params.id }, (err) => {
if (err) res.json(err)
else res.json('Succesfully removed')
});
}
else {
res.status(500).json(err)
}
});
})