猫鼬中两个 .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)
}