猫鼬中两个 .save() 的正确方法
Proper way to two .save() in mongoose
我试图在同一个函数中保存到两个不同的文档和两个不同的模型,但无论我尝试什么,我似乎都会遇到奇怪的错误。似乎猫鼬出于某种原因使它完全不起作用。
我有两个嵌套的 findOne 函数,一个是查找书籍,另一个是查找教授,目的是更新它们以相互关联。
有没有推荐的方法我应该这样做,也许是两个单独的后端端点和两个单独的函数?这将是解决此问题的一种方法,但我想知道为什么我不能执行以下操作。
await prof.save().then(async () => {
await book
.save()
.then(() => {
return res.status(200).json({
success: true,
message: 'items updated'
}).catch( (err) => {
return res.status(400)
})
})
})
您可能想看看 Mongoose's documentation 中间件,尤其是关于 pre .save() 中间件的部分。
你想要做的是在每次保存一个项目时触发一些功能。特别是,您希望此函数本身成为另一个保存函数。这需要在您的 Profs Schema 中完成,并且您需要要求 Books 模型才能使其工作:
ProfsSchema.pre('save', async function (next) {
const prof = this;
try {
await Books.findOneAndUpdate({ ... });
next();
} catch (e) {
throw e;
}
})
当然,这是一个非常示意性的建议:{ ... }
代表您想要应用到图书文档的任何更新。此外,您可能想要做不同的事情,无论是使用 if (prof.isNew)
创建新的 prof 文档还是仅在修改某些字段时触发这些函数 if (prof.field.isModified)
。
无论如何,我强烈建议您出于这种目的学习使用 Mongoose 的中间件:它是一个相当强大的工具,可以跨 MongoDB 集群互连不同模型。
首先你不能同时使用await
和.then .catch
。如果你想在 mongoose 中更新两个或多个集合,最好使用 transactions,它就像关系数据库中的 rollback
,但是如果你是 mongoose 的新手,则很难实现事务,
没有交易你可以这样做
try {
await prof.save();
await book.save();
return res.status(200).json({
success: true,
message: "items updated",
});
} catch (error) {
return res.status(400)
}
我试图在同一个函数中保存到两个不同的文档和两个不同的模型,但无论我尝试什么,我似乎都会遇到奇怪的错误。似乎猫鼬出于某种原因使它完全不起作用。
我有两个嵌套的 findOne 函数,一个是查找书籍,另一个是查找教授,目的是更新它们以相互关联。
有没有推荐的方法我应该这样做,也许是两个单独的后端端点和两个单独的函数?这将是解决此问题的一种方法,但我想知道为什么我不能执行以下操作。
await prof.save().then(async () => {
await book
.save()
.then(() => {
return res.status(200).json({
success: true,
message: 'items updated'
}).catch( (err) => {
return res.status(400)
})
})
})
您可能想看看 Mongoose's documentation 中间件,尤其是关于 pre .save() 中间件的部分。 你想要做的是在每次保存一个项目时触发一些功能。特别是,您希望此函数本身成为另一个保存函数。这需要在您的 Profs Schema 中完成,并且您需要要求 Books 模型才能使其工作:
ProfsSchema.pre('save', async function (next) {
const prof = this;
try {
await Books.findOneAndUpdate({ ... });
next();
} catch (e) {
throw e;
}
})
当然,这是一个非常示意性的建议:{ ... }
代表您想要应用到图书文档的任何更新。此外,您可能想要做不同的事情,无论是使用 if (prof.isNew)
创建新的 prof 文档还是仅在修改某些字段时触发这些函数 if (prof.field.isModified)
。
无论如何,我强烈建议您出于这种目的学习使用 Mongoose 的中间件:它是一个相当强大的工具,可以跨 MongoDB 集群互连不同模型。
首先你不能同时使用await
和.then .catch
。如果你想在 mongoose 中更新两个或多个集合,最好使用 transactions,它就像关系数据库中的 rollback
,但是如果你是 mongoose 的新手,则很难实现事务,
没有交易你可以这样做
try {
await prof.save();
await book.save();
return res.status(200).json({
success: true,
message: "items updated",
});
} catch (error) {
return res.status(400)
}