如何在 MongoDB 中正确删除记录及其所有引用

战争指挥官

我有一个user集合,我有一个删除用户的 API。但是,我在其他集合中使用用户作为参考,例如 inPosts也有一个 userId 参考visitRequests

有没有合适的方法来做到这一点?还是我应该在每个集合中做一个这样的特定查询?

await User.findOneAndDelete({ _id: id });
await visitRequestModel.findOneAndDelete(
  {_userId: id},
);
...

我还想例如更改 Posts 集合中的状态而不是删除它。

而且,这可以用聚合方法来完成吗?

T-斯塔克

解决此问题的一种流行方法是使用 MongoDB 的前/后保存挂钩中的任何一个来进行删除查询。但我推荐的一个更好的解决方案是使用 MongoDB 事务,考虑到要删除的引用数量可能会随着应用程序的增加而增加,并且您希望更新帖子的状态而不是删除。如果您从关系数据库原生的 ACID 角度来看,事务非常有用。为避免不一致,因为在您提出的上述方法或什至使用挂钩时,一个查询可能会在其他查询运行后失败,这对您的应用程序可能非常不利。所以事务解决了这个问题,因此要走的路如下:

  • 在您必须连接到数据库后获取您的 Mongodb 连接。const connection = mongoose.connection;
  • 您现在可以实现如下所示的事务:
const session = await connection.startSession();
console.log('started new session')
// it is advisable to use a try/catch block here to handle failures and rollback
try {
  await session.startTransaction();
  console.log('transaction started'); //just some logging;
  await User.findOneAndDelete({ _id: id }, { session });
  await visitRequestModel.findOneAndDelete({ _id: id }, { session });
  // now to update your post's status
  await Posts.updateOne({ _id: id }, { status: 'newStatus' }, { session });
  await session.commitTransaction();
  console.log('transaction(delete operation) successful');

} catch (error) {
   console.log('transaction failed');
   throw new Error(err);
   await session.abortTransaction();
}
await connection.endSession();
console.log('session ended')

这样,abortTransaction()如果过程中发生错误或查询失败,您可以保证您的数据一致性,并且一切都回滚到以前的方式。您还可以添加甚至与会话无关的其他查询,只需记住{ session }作为参数传递的查询是与正在运行的事务关联的查询。

注意:如果您使用的是自托管 MongoDB 实例(可能是您的本地安装),您可能必须配置 MongoDB 副本集/分片集群,因为独立 MongoDB 安装不支持事务。但是,如果您使用的是 Atlas,那么无需任何配置即可。

希望这可以帮助...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在MongoDB中正确删除孤立的引用?

如何在 Ubuntu 18.04 中正确安装 Ionic 框架及其所有依赖项?

如何在iOS中正确重命名颜色集及其所有参考?

如何删除文件夹及其所有历史记录

MongoDB:如何在MongoDB Shell中删除集合的所有记录?

如何在mongodb中正确优化查询?

如何删除目录及其所有内容?

如何在React中正确绑定MongoDB中的数据?

如何在Promise中正确实现mongodb async / await?

如何在MongoDB中正确进行批量更新/更新

如何在MongoDB Shell中正确使用findOne?

如何在MongoDB-Shell中正确遍历搜索结果?

如何在Go中正确使用MongoDB会话?

如何在Celery Worker中正确连接到mongodb?

如何在 MongoDB 和 NodeJS 中正确使用 $lookup

如何在 MongoDB 中正确使用 $group 运算符?

如何在带有嵌入文档的MongoDB中正确使用聚合?

如何在MongoDB中删除或删除集合?

如何在 MongoDB 中复制记录/文档?

如何在mongodb引用模型中进行记录

如何在MongoDB中以升序/降序显示所有数据库及其大小

如何在mongodb中删除多个文档?

如何完全删除ubuntu-desktop及其所有已安装的软件包?

如何删除领域的父对象及其所有子对象?

如何从Rails App中完全删除Webpack及其所有依赖项

如何从列表中删除一个元素及其所有重复项?

如何删除kubuntu-full及其所有应用程序?

如何真正,完全和完全删除程序及其所有文件

如何在春季数据MongoDB的所有字段指数?