2011-02-16 14 views
4

Couch DB Joinsに記載されている例を見てください。CouchDBビューの照合、1つのキーへの結合、他の値の検索

ビューの照合とブログ記事に対して1つのドキュメントを作成する方法について説明しています。その後、各コメントはCouchDBで別々のドキュメントになります。たとえば、「マイ・ポスト」と5つのコメント「マイ・ポスト」と合計6個のドキュメントが関連付けられています。これらの例では、"myslug"は、ポスト文書と各コメント文書の両方に格納されているため、の "myslug"キーを使用してCouchDBを検索すると、すべての文書が返されます。

ここに問題/質問があります。コメントの投稿者と、カテゴリが「ニュース」の投稿を検索したいとします。どのようにこれは正確に動作するのでしょうか?例えばので

:著者ボブのコメントをつかむ、?startkey=["myslug"]

しかし、私はこれをしたい、と:これに基づいて、私のブログの記事やコメントをロードします

function(doc) { 
    if (doc.type == "post") { 
    emit([doc._id, 0], doc); 
    } else if (doc.type == "comment") { 
    emit([doc.post, 1], doc); 
    } 
} 

カテゴリニュースの投稿です。この例では、ボブは、ニュースのブログ投稿に3つのコメントを書いています。 CouchDBは、両方のドキュメントに存在するキーだけを検索し、あるドキュメントのキーを検索しないようにし、がマップ関数と共にに「参加」したように見えます。

つまり、投稿とコメントがスラッグによって結合されている場合、id akaで結合された1つのドキュメントと別のドキュメントの別のフィールドを検索するにはどうすればよいですか。スラッグ?

それはこのようなものになるだろうSQLで

:私はほとんどあなたの質問に答えるために資格ないんだけど、私は私がに来ていると思うので、私はおよそ一週間のCouchDBを調査してきた

SELECT * FROM comments JOIN doc.id ON doc.post WHERE author = bob AND category = news 
+1

これは興味深い質問です。しかし、私はまだあなたが必要とするものが正確に不明です。 SQLでどのように動作するのか説明することは可能ですか?それから私達はカウチ方法を示すことができます! – JasonSmith

+0

問題はありません...(私の文法を許してください)...コメントから選択する* doc.postのauthor = bobとcategory = newsのところでdoc.idに参加してください。言い換えれば、私はslug/idのpostsテーブルとcommentsテーブルに参加しています。そして、投稿者のコメントとカテゴリの投稿を検索しています。カテゴリニュースと作者によるコメントのみbob – Matt

+0

私はあなたが探しているものを正確に知っています。私はこの記事を見に行きましたhttp://jamietalbot.com/2010/03/24/using-multiple-start-and-end-keys-for-couchdb-views/これはあなたが必要とするものかもしれません。 – Mark

答えて

0

結論はできません。ビューの結果を更新できるように、ビューの結果を1つのドキュメントのみに結びつける必要があります。あなたは、少なくともあなたが欲張りな検索をしたくない場合は、非正規化する必要があります。誰かがこれを行うための巧妙な方法を考え出すなら、私は本当に知りたいと思う。

0

CouchDBでSQL結合を近似できる方法はいくつかあります。私はここに同様の質問をしてきました:Why is CouchDB's reduce_limit enabled by default? (Is it better to approximate SQL JOINS in MapReduce views or List views?)

  1. をあなたはMapReduceのを使用することができます(ない良いオプション)
  2. あなたがリストを使用することができます(これは、あなたができることを意味し、結果を発する前に、結果セットを反復処理します "
  3. 私はまだこれを理解していませんが、明らかに「照合」を使うこともできます(私はいつもカウントを取得し、Reduceでしかその機能を使用できないようです。
関連する問題