gpt4 book ai didi

javascript - Mongoose findOneAndUpdate 后操作失败怎么办

转载 作者:行者123 更新时间:2023-12-02 21:01:38 25 4
gpt4 key购买 nike

我有一个 Mongoose 模式,它有一个属性,它是 ObjectId 的数组。子文档。

如果需要删除/删除其中一个子文档,我当然想将其从父文档的数组属性中删除。

我的问题是:我以什么顺序执行子级的删除/删除操作以及父级的 findOneAndUpdate 操作?

我问的原因是,如果我先成功删除/删除子项,但随后删除 ObjectId 时出现错误从父级的数组属性来看,子级似乎仍然存在于父级下。

但是,如果我删除 ObjectId首先从父级,然后在删除/删除子级时出现问题,我认为没有办法在删除 ObjectId 之前将父级恢复到原来的状态。 ,如果可以的话,我宁愿不要孤立的文档。

我现在想出的东西感觉很“hacky”,并且可能会产生自己的错误:

  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}`);
}
}

最佳答案

您可以首先对子文档运行删除操作,然后对父文档运行更新操作。如果您使用回调,则可以将第二个操作嵌套在第一个操作的 .then block 下,以便保证子文档。在更新父文档之前被删除。

关于javascript - Mongoose findOneAndUpdate 后操作失败怎么办,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61331130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com