2011-12-10 3 views
19

私はMongoとSOのようなペットプロジェクトを作りたいと思っています。投稿タグを実装したいと思います。各タグには名前とスラッグ(URL内のIDとして使用される文字列)があり、投稿には複数のタグがあります。私は、 "タグAを持っている投稿を見つけ、タグBを持っていない投稿を探す"というようなクエリを作成することができたいと思います。これを行うためのmongo-wayが何か不思議です。Mongoで投稿タグを実装する方法は?

1つの方法は、各ポストにタグIDの配列を格納することです。これにより、前記クエリは簡単になりますが、タグ名とスラッグを取得するために、各ポストごとに余分なタグが必要になります。別の方法は、各投稿に[タグ名、タグ・スラッグ]の配列を格納することですが、findでその情報を使用できるかどうかはわかりません。

mongoの方がうまくいく方法はありますか?私はNoSQLを初めて使っているので、これをどのように達成できるかについてアドバイスをいただきたいと思います。また、私はPHPバインディングを使用していますが、それはおそらく重要ではありません。

答えて

38

あなたが使用するタグとそれぞれのスラグが変更されることはほとんどないと思いますが、2番目の方法が優れていると思います。しかし、私は小さな変更を示唆している - というよりも[name, slug]の配列を格納し、post文書この例のように、タグのサブドキュメントを作成することによって、フィールドを明示的に:

{ 
    "_id" : ObjectId("4ee33229d8854784468cda7e"), 
    "title" : "My Post", 
    "content" : "This is a post with some tags", 
    "tags" : [ 
     { 
      "name" : "meta", 
      "slug" : "34589734" 
     }, 
     { 
      "name" : "post", 
      "slug" : "34asd97x" 
     }, 
    ] 
} 

あなたは、その後使用して、特定のタグで投稿を照会することができますこのようなドット表記

db.test.find({ "tags.name" : "meta"}) 

tagsが配列であるので、モンゴは、配列の任意の要素に対してクエリ全体ではなく、配列が一致してくれており、ドット表記を使用して、一致させることができます特定の分野に対する

は、特定のタグを含む記事 ないを照会 $ne使用するには:

db.test.find({ $and : [{ "tags.name" : { $ne : "fish"}}, {"tags.name" : "meta"}]}) 

希望:

db.test.find({ "tags.name" : { $ne : "fish" }}) 

そして、もう一つのタグを含む記事を照会するためではなく、他のは、$andを使用しますこれは役に立ちます!

+4

タグにスラッグを追加する必要がありますか?または値の配列を持つだけでいいですか? –

+2

私はスラムがちょうどOPのアプローチの実装の詳細に起こったと思います。あなたはそれを必要としません。 – Russell

+2

タグクラウドを作成したい場合など、すべてのタグを返すクエリはありますか?編集:これは動作するように見えます:http://stackoverflow.com/a/4977057/389812 – gdw2

関連する問題