6

リンクには 1 つ以上のタグがあるため、最初はタグを埋め込むのが自然に思えるかもしれません。

link = { title: 'How would you implement these queries efficiently in MongoDB?'
         url: 'http://stackoverflow.com/questions/3720972'
         tags: ['ruby', 'mongodb', 'database-schema', 'database-design', 'nosql']}

これらのクエリはどのように効率的に実装されますか?

  • 1 つ以上の指定されたタグを含むリンクを取得します (指定されたタグでリンクを検索するため)。
  • 繰り返しのないすべてのタグのリストを取得します (検索ボックスのオートコンプリート用)
  • 最も人気のあるタグを取得する (上位 10 個のタグまたはタグ クラウドを表示するため)

リンクを上記のように表現するアイデアは、 MongoNY プレゼンテーションのスライド 38 に基づいています。

4

2 に答える 2

4

「値」タグを含むリンクを取得します。

db.col.find({tags: "value"});

「val1」、「val2」タグを含むリンクを取得します。

db.col.find({tags: { $all : [ "val1", "val2" ] }});

繰り返しなしですべてのタグのリストを取得します。

db.col.distinct("tags");

最も人気のあるタグを取得する - これは既存のデータベースでクエリできるものではありません。クエリがドキュメントをフェッチするたびに人気フィールドを更新し、ソートフィールドをに設定してクエリを実行する必要があります。人気。

更新:人気機能の提案されたソリューション。次のコレクションを追加してみてください。これをタグと呼びましょう。

doc = { タグ: 文字列、ポップ: 整数 }

クエリを実行すると、表示されたすべてのタグが収集されます (これらは集約して非同期で実行できます)。つまり、「tag1」、「tag2」、「tag3」というタグが得られるとします。

次に update メソッドを呼び出し、pop フィールドの値をインクリメントします。

db.tags.update({tag: { $in: ["tag1", "tag2", "tag3"] }}, { $inc: { pop: 1 }});
于 2010-09-15T19:22:43.350 に答える
0

$push の代わりに $addToSet を使用してタグ配列を変更することもできます。タグが既に存在する場合、これはドキュメントを変更しません。タグを頻繁に変更する場合、これは少し効率的になります (ドキュメントがそれほど大きくならないため)。次に例を示します。

> db.tst_tags.remove()
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag1'}}, true)
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag1'}}, true)
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag2'}}, true)
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag2'}}, true)
> db.tst_tags.update({'name':'test'},{'$addToSet':{'tags':'tag3'}}, true)
> db.tst_tags.find()
{ "_id" : ObjectId("4ce244548736000000003c6f"), "name" : "test", 
  "tags" : [ "tag1", "tag2", "tag3" ] }
于 2010-11-16T08:44:44.147 に答える