Meteor には次のようなコレクションがあります。
TagsToArticles = {
tag: "Tag1",
articles: [ article1Id, article2Id, article3Id ]
}
記事のコレクションには次のスキーマがあります
Articles = {
permission: "private"
...
}
タグは、本質的に索引付けされた検索用語です。
各記事には、「プライベート」、「グループ」、または「パブリック」に設定された権限があります。
現在、次のようなタグを公開しています。
Meteor.publish("allTags", function() {
return TagsToARticles.find({});
}
次に、クライアントで記事のリストをフィルター処理し、公開されている記事、または現在のユーザーによって作成された非公開の記事のみを表示します。
ただし、理想的には、セキュリティ上の理由から、クライアントが非公開記事の記事 ID にアクセスできないように、公開機能自体の中でサーバー側でフィルタリングを行いたいと考えています。クライアントが適切な権限を持っていない限り、実際の記事オブジェクトにアクセスできないようにしていますが、さらに一歩進んで、結果から ID を完全に削除したいと考えています。
だから私が探しているのは、基本的に次の疑似コードを可能にするクエリです:
TagsToArticles.find({ articles.foreach(articleId) {
if (Articles.findOne(articleId).permission == 'public') ||
(Articles.findOne(articleId).ownerId == Meteor.userId())
include articleId
}
私は当初、上記とまったく同じ関数を使用してこれを行うことを考えていました (基本的に、すべてのレコードを取得してから、各レコードを調べて手動で配列をプルーニングし、更新されたレコードのセットを返します)。また、基になるデータが変更された場合、レコード セットは更新されません。
ジョブを実行する単一の find() クエリがない場合、関数を使用して追加のパスを実行し、それでもリアクティブ データ セットを返す方法があれば、そのソリューションでも問題ありません。
いずれにせよ、これは非正規化されたコレクションなので (タグも記事ドキュメント内にあります)、さらに非正規化して、記事 ID だけでなく ownerId と許可を含めることもできると思います。しかし、個々の配列要素をテストする方法がまだわかりません。また、可能であれば、必要な非正規化の量を最小限に抑えたいと考えています...