删除mongo数据库中的孤立子文档

时间:2012-10-16 13:13:23

标签: ruby mongodb orm mongoid hierarchy

我的理解是,当您在Mongo中销毁父文档时,您也会销毁其子文件,并且它会向下级联,直到所有引用的文档都被删除。

我有一个像以下

的集合结构
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

我在代码中遇到了一个情况,我需要删除A类及其所有相关文档中的一个。由于这些模型中的每一个都基于Mongoid,因此我使用了destroy_all方法

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

通过阅读文档,我认为每个引用的文档都将被删除。

不幸的是,发生的事情是我的所有课程都已消失,我的数据库中有一堆孤立的课程。

所以:

A)假设destroy_all没有按照我的想法行事。是否可以使用任何东西来实际删除mongoid中的父级及其所有引用文档?

B)虽然我在本地机器上执行了此操作,但我仍然想知道,有没有办法从更改的集合中删除孤立文件?

2 个答案:

答案 0 :(得分:2)

您需要添加:

:dependent => :destroy

到您的协会。

参见“依赖行为”:http://two.mongoid.org/docs/relations/referenced/1-n.html

答案 1 :(得分:0)

  

据我了解,当您在Mongo中销毁父文档时,您也会销毁其子文件

仅当它是单个文档时。您正在显示许多文档的结构。

我不是Ruby程序员,我从未使用过mongoid,但destroy_all基本上remove与文档支持的多个文档相匹配:http://two.mongoid.org/docs/persistence/standard.html#destroy_all < / p>

  

删除提供的数据库中的所有匹配文档   条件。有关首选方法,请参阅删除标准部分   执行这些操作。这会在所有匹配上运行destroy回调   文档。

我猜想如果你想删除孩子,你将需要手动指定它们,因为MongoDB没有关系行为,所以没有能力自己级联你的“关系”。

我想说,删除孤立文档的唯一真正方法是通过查询子集合中查询父集合以查看它是否存在的所有对文档父节点的不同引用,这很难。如果它不存在,请将其删除。