验证MongoDB中的引用(外键)完整性

时间:2014-07-10 14:08:01

标签: mongodb

通过将A ObjectId存储在B(比如B's)中,我将两个MongoDB集合链接起来,比如AA.bId。如何查找A的所有实例,其中bId不再有效(相应的B不存在)?

基于answersofficial documentation,很明显MongoDB不会强制引用。所以我需要一种有效的方法来找到无效的A's以便清除它们。

AB是大集合,所以我想避免:

  • 将所有B.id's加载到内存并执行$nin
  • 遍历所有A's并执行B.findById(A.bId)

2 个答案:

答案 0 :(得分:1)

MongoDB没有连接 - 句点。没有命令会影响多个集合。您必须单独检查每个对象的引用。

如果您希望将来避免这种情况,可以考虑使用嵌入而不是引用。在许多情况下,您将删除孤立对象,您有一个组合而不是聚合的情况。孩子是父母不可分割的一部分,没有孩子就没有意义。通过使子节点成为父节点中的数组ob子对象,通常可以最好地表达这种情况。

答案 1 :(得分:1)

我会通过编写应用程序代码来解决此问题,以便A中的任何无效文档一旦失效就会被删除。这与您编写脚本以同时查找和删除A中所有无效文档的想法不同。

第一步是问自己“在我的应用程序的哪个位置,A集合中的文档会变得无效?”说答案是“每当删除B集合中的文档时”。然后我会编写一个函数来运行post-delete来删除A中的任何无效文档。如果您正确设置文档结构和索引,则可以快速完成此操作。

要问自己的一个更大的问题是,如果您在一个集合中引用另一个集合中的数据,并且需要频繁地加入该数据,那么您的数据模型在MongoDB中可能没有高效的结构。或许您应该完全转移到关系数据库系统。