0

我的理解是,当您在 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) 假设 destroy_all 没有按照我的想法做。有什么东西可以用来在 mongoid 中实际删除父对象及其所有引用的文档吗?

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

4

2 回答 2

2

您需要添加:

:dependent => :destroy

到你的协会。

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

于 2012-10-17T23:36:14.400 回答
0

我的理解是,当您在 Mongo 中销毁父文档时,您也会销毁其子文档

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

我不是 Ruby 程序员,我从未使用过 mongoid,但它似乎destroy_all本质remove上匹配多个文档,如文档支持:http: //two.mongoid.org/docs/persistence/standard.html#destroy_all

在给定条件的情况下删除数据库中的所有匹配文档。有关执行这些操作的首选方法,请参阅删除标准部分。这将对所有匹配的文档运行销毁回调。

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

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

于 2012-10-16T13:23:18.547 回答