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の1つとそれに関連するすべてのドキュメントを削除する必要がある状況に遭遇しました。これらの各モデルは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 に答える