2014-07-10 63 views
1

通過在A(比如A.bId)中存儲B's ObjectId,我鏈接了兩個MongoDB集合,例如AB。如何找到A的所有實例,其中bId不再有效(對應的B不存在)?在MongoDB中驗證引用(外鍵)完整性

根據answersofficial documentation,顯然MongoDB不強制引用。所以我需要一種有效的方法來找到無效的A's以清除它們。

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

  • 加載所有B.id's到內存中,並通過所有A's做一個$nin
  • 迭代並做B.findById(A.bId)

回答

1

MongoDB不會連接 - 期間。沒有影響多個集合的命令。您將必須單獨檢查每個對象的引用。

當你想在將來避免這種情況時,你可能會考慮使用嵌入而不是引用。在許多情況下,你會刪除孤立的對象,你有一個組合而不是聚合的情況。孩子是父母的一個組成部分,沒有任何意義。這種情況通常通過使子對象在父對象中成爲數組ob來表達得最好。

1

我會通過編寫我的應用程序代碼來解決這個問題,以便A中的任何無效文檔一旦失效就會被刪除。這與您編寫腳本以同時查找並刪除A中的所有無效文檔的想法不同。

第一步是問自己:「在我的應用程序中的哪個點上,A集合中的文檔會失效?」說的答案是「只要從B集合中刪除文檔。」然後,我會編寫一個函數來運行刪除後刪除A中的任何無效文檔。如果您正確設置了文檔結構和索引,這可以快速完成。

要問自己的一個更大的問題是,如果您從一個集合中引用另一個集合中的數據,並且需要頻繁地加入該數據,或許您的數據模型在MongoDB中的構建方式不是很有效。或者,您應該完全轉向關係數據庫系統。