2012-10-16 55 views
0

這是我的理解,當你在Mongo中銷燬父文檔時,你也銷燬它的子節點,並且它會級聯到鏈中,直到所有引用的文檔都被刪除。在mongo數據庫中刪除orhpan子文檔

我有如下所示

class A 
    include Mongoid::Document 
    field :name, :type => String 
    has_many :bs 
end 

class B 
    include Mongoid::Document 
    field :name, :type => String 
    has_many :cs 
end 

class C 
    include Mongoid::Document 
    field :name, :type => String 
end 

我在我的代碼跨形勢下應運而生,我需要刪除類之一,其所有相關文件的集合結構。由於這些模型中的每一個都是基於Mongoid我用的destroy_all方法,像這樣

a = A.where({'_id' => "123456789"}) 
a.bs.destroy_all 
=> 'however many a's I had' 

從閱讀中,我認爲,每一個被引用的文件將被刪除藏漢文檔。

不幸的是,所發生的事情是我所有的班級b都不見了,我的數據庫中有一堆孤兒班c。

所以:

A)假設destroy_all沒有做什麼,我以爲會。有沒有什麼可以用來實際刪除mongoid中的父項及其所有引用的文檔? B)雖然我在本地機器上執行了這個操作,但我仍然想知道,是否有任何方法可以從已更改的集合中刪除孤立文檔?

回答

0

這是我的理解是,當你破壞蒙戈父文檔,你也破壞了孩子

只有當它是一個單一的文件。您正在顯示許多文檔的結構。

我不是一個Ruby程序員,我從來沒有使用mongoid但是似乎destroy_all基本上remove如通過文檔支持符合多個文檔:http://two.mongoid.org/docs/persistence/standard.html#destroy_all

刪除在所有匹配的文件數據庫提供了 條件。有關刪除的條件部分,請參閱 執行這些操作的首選方法。這將運行銷燬所有匹配的 文件的回調。

我在猜測,如果你想刪除孩子,你將被要求手動指定他們,因爲MongoDB沒有關係行爲,所以沒有能力自己級聯你的「關係」。

我想說,刪除孤立文檔的唯一真正方法很可能是通過查詢父集合中的文檔父母的所有不同引用來查詢父集合是否存在的難題。如果它不存在,請將其刪除。