Мангуст удаляет ссылки на документы - PullRequest
0 голосов
/ 02 октября 2019

У меня есть 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)
        }
    });
})

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Вы должны написать свою собственную функцию удаления. Посмотрите на этот вопрос , где эта проблема уже решена.

0 голосов
/ 02 октября 2019
User.findOneAndUpdate({ username: req.user.username }, { $set : { projects : [] 
   } }, (err, user) => {
     Project.remove({
        "_id": {
        $in: user.projects
     }
  }, function(err) {
    if(err) return next(err);
    user.deleteOne()
  })
})

Это поможет, а findOneAndUpdate вернет оригинальный документ вместо обновленного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...