0

mongo データベースとその中にいくつかのコレクションがあります。たとえば、target_id に一致するすべてのエントリをコレクションから削除したいと考えています。秘訣は、target_id に一致するエントリに「接続された」エントリも削除する必要があることです。

例えば

DB
Culture   (_id, owner_id)
Document  (_id, target_id)
Entity    (_id, target_id)
Field     (_id, entity_id)
Form      (_id, target_id)
Question  (_id, form_id)
Layout    (_id, question_id)

これで、すべてのドキュメントを簡単に削除できます

db.Document.remove( {"_id": ObjectId(target_id)});

したがって、最初のトリッキーな部分は、Culture コレクションの一部のエントリに owner_id = document_id が含まれている可能性があることです。したがって、エンティティ エントリを削除する前に、カルチャ エントリも削除する必要があります。

2 番目の問題は、フィールド コレクションの target_id エントリで直接アクセスできないことです。これらのフィールドは entity_id で見つけることができるためです。

したがって、target_id を提供する mongo シェルから実行するスクリプト/クエリを作成し、target_id によって直接的または間接的に「参照」されるすべてのエントリを削除したいと思います。IDによる単純な検索/削除以外の経験がなかったため、このクエリはスタックしました。

私が理解している限り、これを段階的に行うことができます。たとえば、最初にすべてのエンティティを見つけます。

db.Entity.find({ "$where" : "{"target_id" : ObjectId(target_id)}" });

2 番目のステップは、上記のクエリからすべてのエンティティの owner_id = エンティティ ID を持つすべてのカルチャを削除することです。どうすれば走れますか

db.Culture.find({ "$where" : "{"owner_id" : ObjectId(entity_id)}" });

entity_id が最初のクエリですべてのエンティティを反復処理する場所は?

4

2 に答える 2

1

IIUC さん、 $in演算子を探しています。

  1. set1 = 削除するすべての ID を検索します
  2. set2 = set1 内の ID のすべての参照 ID を検索
  3. set2 の in 演算子でその ID に一致するすべてのドキュメントを削除します
  4. set1 の in 演算子でその ID に一致するすべてのドキュメントを削除します

これを階層の下で繰り返します...

例:

db.Culture.find({"owner_id" : {"$in":[set_of_entityids]" }});

クエリから bson ID を取得することに注意してください。したがって、おそらく ObjectId を前に付ける必要はありません。

HTH

于 2013-04-10T11:20:26.497 に答える
0

findAndMondify を使用してそれを行う方法の 1 つ。ドキュメントを更新すると同時に、ID を取得することもできます。したがって、ドキュメントを ACTIVE = FALSE としてマークし、 findAndModify で ID を取得します。最後に、ACTIVE = FALSE であるすべてのエントリを削除します。私のアプリケーションでどのように使用したかを見ることができます: http://devesh4blog.wordpress.com/2013/03/01/findandmodify-in-mongodb-a-practical-example/

于 2013-04-10T11:22:39.007 に答える