Ruby 删除mongo数据库中的orhpan子文档

Ruby 删除mongo数据库中的orhpan子文档,ruby,mongodb,orm,mongoid,hierarchy,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 :

我的理解是,当您在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'
通过阅读文档,我认为每个引用的文档也会被删除

不幸的是,我所有的b类都不见了,我的数据库中有一堆孤立的c类

因此:

A) 假设所有的毁灭都不会像我想的那样。在mongoid中是否有任何东西可用于实际删除父级及其所有引用文档

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

我的理解是,当你在Mongo销毁一个父文档时,你也会毁掉它的子文件

只有当它是一个文档时。您正在显示许多文档的结构

我不是Ruby程序员,也从未使用过mongoid,但似乎
destroy\u all
本质上是
remove
,与文档支持的多个文档匹配:

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

我猜想,如果您也希望删除子项,那么您将需要手动指定它们,因为MongoDB没有关系行为,因此无法自行级联您的“关系”

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

您需要添加:

:dependent => :destroy
给你的协会

参见“依赖行为”: