У меня есть схема Mon goose, свойство которой представляет собой массив ObjectId
дочерних документов.
Если один из этих дочерних документов необходимо удалить / удалить, конечно, я хочу удалить его из свойства массива родителя.
У меня такой вопрос: В каком порядке я выполняю операцию удаления / удаления для дочернего объекта и операцию findOneAndUpdate для родителя?
Причина, по которой я спрашиваю, состоит в том, что если я сначала удаляю / удаляю потомка успешно, но затем получаю ошибку, удаляющую это ObjectId
из свойства массива родителя, то кажется, что потомок все еще существует под родителем.
Однако, если я сначала удаляю ObjectId
из родительского элемента, а затем возникают проблемы с удалением / удалением дочернего элемента, я не думаю, что есть способ вернуть родительский элемент до удаления этого ObjectId
и я бы предпочел, чтобы я не держал осиротевшие документы, если бы мог помочь.
То, что я придумала в этот момент, кажется "хакерским" и может, в свою очередь, произвести его собственные ошибки:
async deleteForm(req,res,next) {
let currentLocation;
try {
//Remove the reference to the Form from the 'forms' array in the parent 'Location'
try {
currentLocation = await Location.findOneAndUpdate(
{
forms: mongoose.types.ObjectId(req.params.formId)
},
{
$pull: {forms: req.params.formId}
}
);
} catch (err) {
console.error(err)
throw new Error('Error removing Form from Location')
}
//Actually find and remove the 'Form' itself
try {
await Form.findByIdAndRemove(req.params.formId);
} catch (err) {
console.error(err);
/* If the 'Form' can't be removed, re-add the reference to the form back into the
parent 'Location's 'forms' array*/
await currentLocation.update({
$push: {forms: mongoose.types.ObjectId(req.params.formId)}
})
throw new Error('Error deleting Form')
}
} catch (err) {
req.session.error = err;
} finally {
res.redirect(`/locations/${currentLocation._id}`);
}
}