通过将A
ObjectId存储在B
(比如B's
)中,我将两个MongoDB集合链接起来,比如A
和A.bId
。如何查找A
的所有实例,其中bId
不再有效(相应的B
不存在)?
基于answers和official documentation,很明显MongoDB不会强制引用。所以我需要一种有效的方法来找到无效的A's
以便清除它们。
A
和B
是大集合,所以我想避免:
B.id's
加载到内存并执行$nin
A's
并执行B.findById(A.bId)
答案 0 :(得分:1)
MongoDB没有连接 - 句点。没有命令会影响多个集合。您必须单独检查每个对象的引用。
如果您希望将来避免这种情况,可以考虑使用嵌入而不是引用。在许多情况下,您将删除孤立对象,您有一个组合而不是聚合的情况。孩子是父母不可分割的一部分,没有孩子就没有意义。通过使子节点成为父节点中的数组ob子对象,通常可以最好地表达这种情况。
答案 1 :(得分:1)
我会通过编写应用程序代码来解决此问题,以便A
中的任何无效文档一旦失效就会被删除。这与您编写脚本以同时查找和删除A
中所有无效文档的想法不同。
第一步是问自己“在我的应用程序的哪个位置,A
集合中的文档会变得无效?”说答案是“每当删除B
集合中的文档时”。然后我会编写一个函数来运行post-delete来删除A
中的任何无效文档。如果您正确设置文档结构和索引,则可以快速完成此操作。
要问自己的一个更大的问题是,如果您在一个集合中引用另一个集合中的数据,并且需要频繁地加入该数据,那么您的数据模型在MongoDB中可能没有高效的结构。或许您应该完全转移到关系数据库系统。