2016-08-16 4 views
1

まず、いくつかの回答(thisなど)を読んでいますが、これをMeteorでどのように実装できるかはわかりません。Meteorの別のコレクションで索引付けされていない文書を削除する

私はitemsのコレクションを持っていて、別のものはcategoriesです。カテゴリは、アイテムが保存されるときに動的に作成されます。ドキュメントが保存されたら、アイテムに関連付けられていないすべてのカテゴリをクリーンアップします。それ、どうやったら出来るの?私はSQLに慣れていて、Luceneのようなインデクサー以外の文書ベースのDBではあまり働いていません。

例えば、私はそれはもはやitemsによって参照されているので"Cat A"を削除しないようにしたい

{ _id: "RK9kQSD7frgreYDvg", name: "Item 1", catId: "c4mE7hANtbWxHFAdm" } 
{ _id: "569aogaGBYBMonkgg", name: "Item 2", catId: "c4mE7hANtbWxHFAdm" } 

と2

{ _id: "mu2KzDbNdTcrZYGKs", name: "Cat A" } 
{ _id: "c4mE7hANtbWxHFAdm", name: "Cat B" } 

ようcategoriesのような2 itemsを与えられました。

私は

const Items = new Meteor.Collection('items'); 
const Categories = new Meteor.Collection('categories'); 

... 

Categories.remove({ _id: { $not: { $in: ... } }); 

のようなものを推測するが、私はその時点からよく分かりません。

+1

私はMongoDBのは、サブクエリに参加したり、テーブルのアイデアをサポートしていないと思うので、最も簡単な方法は、アイテムのすべてのユニークなIDを取得し、すべてのカテゴリを削除することですそのリストには '$ in'はありません。しかし、これは非常に効率が悪く、Itemsコレクションに含まれるドキュメントの数によっては実際的ではないかもしれません。集計を見ることもできます。私はMongoDBのドキュメントを調べましたが、削除フィルタ内で集約関数を使用できない理由は何も見当たりませんでしたが、MongoDBの経験が豊富な人が話す必要があるかもしれません。 – CodeChimp

+1

ありがとうございます。私はあなたに同意します。私は効率的な方法でそれをどうやって行うことができないのか分かりません。とにかく数千ものアイテムはありませんが、私は知りたいのです。 –

答えて

1

削除のクエリでは$nin演算子を使用する必要がありますが、確かに正しい方向です。

最初のクエリは、リスト内のitemsコレクションからcatIdのすべての異なる値を返します。流星に付属のunderscore.js uniq()メソッドと、個別の配列を作成するmap()カーソルメソッドを使用することができます。 2番目の操作では、そのリストを使用してcategoriesコレクション内のエントリを削除します。

次の例では、上記に示します

const Items = new Meteor.Collection('items'); 
const Categories = new Meteor.Collection('categories'); 
const catIds = _.uniq(Items.find‌​({}).map((item) => item.catId;)); 

Categories.remove({ "_id": { "$nin": catIds } }); 
+1

これは機能し、コレクションにあまりにも多くのアイテムがあるとは思わない。ありがとう! –

関連する問題