gpt4 book ai didi

mongodb - MongoDB 中的多对多更新无需事务

转载 作者:行者123 更新时间:2023-12-02 02:43:55 24 4
gpt4 key购买 nike

我有两个具有多对多关系的集合。我想在两个文档中存储链接的 ObjectId 数组,以便我可以获取文档 A 并快速检索所有链接的文档 B,反之亦然。

创建此链接分为两步

  1. 将文档 A 的 ObjectId 添加到文档 B
  2. 将文档 B 的 ObjectId 添加到文档 A

观看 MongoDB 视频后,我发现这是存储两个集合之间多对多关系的推荐方式

我需要确保这两项更新均已完成。在没有事务的情况下稳健地处理这个关键的两步流程的推荐方法是什么?

我可以将这种关系压缩为单个链接集合,优点是单次更新,文档 B 不会丢失文档 A 的链接。缺点是我没有真正按预期使用 MongoDB。但是,因为只有一个更新,所以拥有一个定义多对多关系的链接集合似乎更稳健。

我应该使用安全模式并手动检查随后输入的数据并在失败时重试吗?或者我应该仅在一个集合中表示多对多关系并依赖索引来确保我仍然可以快速获取链接的文档?

有什么建议吗?谢谢

最佳答案

@Gareth,您有多种合法的方法可以做到这一点。因此,他们主要关心的是您计划如何查询数据(即:哪些查询需要快速)

这里有几种方法。

方法#1:“链接”集合

您可以构建一个仅包含集合之间映射的集合。

优点:

  • 支持原子更新,确保数据不丢失

缺点:

  • 尝试在集合之间移动时出现额外查询

方法#2:在较大集合中存储较小映射的副本

例如:您有数百万个产品,但只有一百个类别。然后,您可以将Categories存储为每个Product内的数组。

优点:

  • 占地面积最小
  • 只需更新一次

缺点:

  • 如果走“错路”则需要额外询问

方法#3:存储两个集合中所有映射的副本

(你的建议)

优点:

  • 单个查询访问权限可在任一集合之间移动

缺点:

  • 可能很大的索引
  • 需要交易(?)

我们来谈谈“需求交易”。进行交易的方法有多种,这实际上取决于您需要哪种类型的安全性。

Should I use safe mode and manually check the data went in afterwards and try again on failure?

你绝对可以做到这一点。你必须问自己,如果只有一次保存失败,最糟糕的情况是什么?

方法#4:对更改进行排队

我不知道您是否曾经使用过队列,但是如果您有一些余地,您可以构建一个简单的队列并使用不同的作业来更新各自的集合。

这是一个更先进的解决方案。我倾向于选择#2 或#3。

关于mongodb - MongoDB 中的多对多更新无需事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4992648/

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