0

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 と許可を含めることもできると思います。しかし、個々の配列要素をテストする方法がまだわかりません。また、可能であれば、必要な非正規化の量を最小限に抑えたいと考えています...

4

3 に答える 3

1

composite-publishパッケージの使用を検討する必要があります。

スキーマを正しく理解していれば、パブリッシュ コードは次のようになります。

Meteor.publishComposite('articles', function() {
  return {
    find: function() {
      return Articles.find({ $or: [ { permission: 'public' }, { ownerId: this.userId } ] });
    },
    children: [{
      find: function(article) {
        return TagsToArticles.find( { articles: article.articleId } );
      }
    }]
  }
});

このパッケージはリアクティブ結合を行いますが、これは実際にはかなり高価です。そのことを念頭に置いて、これがまだあなたにとって良い選択であるかどうかを確認してください.

ps パブリッシュでは Meteor.userId() を使用できないことを覚えています。そのため、this.userId を使用しました。

于 2015-07-20T20:24:33.843 に答える
0

Mongo で結合を作成することさえできず、Mongo データベースでの結合に基づいてリアクティブなデータセットを作成することはさらに非現実的に見えます。

しかし、リアクティブ データセットが本当に必要なのでしょうか? Articles データセットの public および userId レコードをサブスクライブし、TagsToArticles で必要なタグをサブスクライブし、記事とタグを列挙してレコードのセットを返すテンプレートのヘルパーを定義するだけです。Articles または TagsToArticles の項目が変更されると、Meteor は自動的に HTML を更新します。

しかし、個々の配列要素をテストする方法がまだわかりません

記事内にタグがある場合は、記事コレクションのみを使用して、公開記事とユーザー記事から一意のタグを収集できます

于 2015-07-20T19:37:07.740 に答える