1

node.js/express/mongodb を使用して自分用のブログ エンジンを作成しようとしています (また、node.js の学習を開始します)。インターネットのチュートリアルよりも少し進んで、ブログ エンジンにタグのサポートを追加したいと思います。

タグで次のことをしたい:

  1. 閲覧者は、すべてのタグを「タグ クラウド ページ」でタグ クラウドとして見ることができます。
  2. 閲覧者は、記事の一覧ページと単一の記事ページで記事が持つタグを確認できます
  3. 閲覧者は単一のタグをクリックして記事リストを表示できます
  4. さらに、閲覧者は特定のタグを持つ記事を SO の方法で検索できます: [tag1][tag2] --> /tags/tag1+tag2 --> tag1 と tag2 の両方を持つ記事のリスト

リレーショナル データベースでは、post_tag テーブルがこれに使用されます。しかし、MongoDB でこれを設計する方法は?

私はMongoDBのデザインをチェックしました-タグ
しかし、efdeeのコメントとして、デザインは

db.movies.insert({
  name: "The Godfather",
  director: "Francis Ford Coppola",
  tags: [ "mafia", "wedding", "violence" ]
})

問題があります:

これは実際には彼の質問に答えていないようです。映画コレクション全体で使用されているタグの個別のリストを取得するにはどうすればよいでしょうか?

これも私の懸念事項です。私のデザインでは、すべてのタグのリストを表示する必要があります。また、各タグに含まれる記事の数も知る必要があります。上記のデザインよりも良い方法はありますか?

上記の設計に関する私の懸念は、タグのリストを表示したい場合、クエリがデータベース内のすべての記事項目を調べることです。より効率的な方法はありますか?

4

3 に答える 3

3

まず、タグにマルチ キー インデックスを作成する必要があります。

次に、この構文を使用してタグに一致するドキュメントを見つけることができます

db.movies.find({ "tags": { $all : [ /^this/, /^that/ ] }})

正規表現の ^ (文字列の開始) を使用しているため、mongo は引き続きインデックスを使用します。

集計フレームワークを使用してキーワード密度を取得するには、単純にカウントを取得できます。

db.movies.aggregate({ $project: { _id:0, tags: 1}}, 
    { $unwind: "$tags" },
    { $group : { _id : "$tags", occur : { $sum : 1 }}})

申し訳ありませんが、iPad からのフォーマットは困難です。

次のようなドキュメントのコレクションになります。

{
   _id: "mytag",
   occur: 383
},
{
   _id: "anothertag",
   occur: 23
},

集計コマンドを使用すると、インラインの結果が返されるため、頻繁に使用される場合は、クライアント アプリ (またはサーバー) が結果をシリアル化またはキャッシュする必要があります。

あなたがそれをどのように進めているか教えてください。

H番目

サム

于 2012-10-05T20:19:14.493 に答える
0

映画コレクション全体で使用されているタグの個別のリストを取得するにはどうすればよいですか?

db.movies.distinct("tags")

効率的なクエリのために、おそらくデータを複製します。タグが編集される可能性は非常に低いため、タグ配列を記事オブジェクトに配置してから、タグをタグコレクションに配置します。タグには、そのタグを含む記事の数または記事の配列が含まれます。 ID。

db.movies.insert({
  id: 1,
  name: "The Godfather",
  director: "Francis Ford Coppola",
  tags: [ "mafia", "wedding", "violence" ]
});

db.tags.insert([
   {name: "mafia", movie_count: 1},
   {name: "wedding", movie_count: 1},
   {name: "violence", movie_count: 1}
});
于 2012-10-05T16:38:38.860 に答える
-1

MapReduce 関数を使用して 4 つのタスクを実行できます。たとえば、すべてのタグのリストの場合、タグをキーとして発行し、reduce 関数でそれらをすべてカウントアップしてカウントを返します。それは私が下るルートでしょう。もう少し考える必要があるかもしれませんが、間違いなく強力です。

http://cookbook.mongodb.org/patterns/count_tags/

于 2012-10-05T18:43:25.637 に答える