没有事务,MongoDB中的多对多更新

Typ*_*son 9 mongodb

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

创建此链接是一个两步过程

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

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

我需要确保两个更新都已完成.在没有交易的情况下,强有力地处理这个至关重要的两步流程的建议方法是什么?

我可以将这种关系压缩成单个链接集合,其优点是单个更新,文档B没有机会错过文档A的链接.缺点是我没有按预期使用MongoDB.但是,因为只有一个更新,所以拥有定义多对多关系的链接集合似乎更加健壮.

我是否应该使用安全模式并手动检查数据后续进入并再次尝试失败?或者我应该只在其中一个集合中表示多对多关系,并依赖索引来确保我仍然可以快速获取链接文档?

有什么建议?谢谢

Gat*_* VP 5

@Gareth,你有多种合法的方式来做到这一点.因此,关键问题是您计划如何查询数据(即:需要快速查询的内容)

这里有几种方法.

方法#1:"链接"集合

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

优点:

  • 支持原子更新,以便数据不会丢失

缺点:

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

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

例如:你有数百万Products,但只有一百Categories.然后你将Categories每个存储为一个数组Product.

优点:

  • 最小的足迹
  • 只需要一次更新

缺点:

  • 如果你采取"错误的方式"的额外查询

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

(你在暗示什么)

优点:

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

缺点:

  • 潜在的大指数
  • 需要交易(?)

我们来谈谈"需求交易".有几种方法可以进行交易,这实际上取决于您需要什么类型的安全性.

我是否应该使用安全模式并手动检查数据后续进入并再次尝试失败?

你绝对可以做到这一点.你必须问自己,如果只有一个保存失败,会发生什么最坏的情况?

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

我不知道你是否曾经使用过队列,但是如果你有一些余地,你可以建立一个简单的队列,并有不同的工作来更新他们各自的集合.

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