2012-01-26 10 views
2

現在、他のドキュメントから作成されたいくつかのドキュメントを持つCouchDBデータベースがあります。これは、文書内に「forked-from」フィールドが表示されます。リンクされたドキュメントからの値に基づいてCouchDBを減らす

例えば:

{ 
"_id":"doc_1", 
"_rev":"1-a23f9403a1d86648b2a304f5a4c78c31", 
"doctype":"entry", 
"data":"foo", 
"permissions":"private" 
} 

{ 
"_id":"doc_2", 
"_rev":"1-9c15e43a8c8d4ce1b00af94b328d268d", 
"doctype":"entry", 
"data":"bar", 
"forked_from":"doc_1" 
"permissions":"public" 
} 

{ 
"_id":"doc_3", 
"_rev":"1-b13c761e43121c074c44736826f3ce7e", 
"doctype":"entry", 
"data":"bat", 
"forked_from":"doc_2" 
"permissions":"private" 
} 

我々は現在、最も人気のある1が何であるかを教えてくれるされ、文書がフォークされた回数を返しますビューを減らす/マップを持っています。

function (doc) { 
    if (doc.doctype === 'entry' && doc.forked_from) { 
     emit(doc.forked_from, 1); 
    } 
} 

function(keys, values, rereduce) { 
    return sum(values); 
} 

group=trueで、このビューを照会した結果は次のようになります。

{"rows":[ 
{"key":"doc_1","value":1}, 
{"key":"doc_2","value":1} 
]} 

しかし、私たちが希望しても、そのようにのみ、「パブリック」に設定されたアクセス権を持っている文書を返すことです照会した結果は次のようになります。

doc_1はプライベートであるため返されません。

地図の段階で結果をフィルタリングすることはできません。確認するドキュメント全体ではなく、ドキュメントIDだけがあるためです。私はリンクされたドキュメント機能を使用してキーにドキュメントを追加しようとしましたが、マップのemit{'_id': doc.forked_from}を含めましたが、CouchDBは 'include_docsは縮小ビューに対して無効です'と応答します。

このビューの結果をフィルタリングする方法についてのご意見はありますか?

+0

あなたは、元の文書が公開されていることを意味していましたか?それともフォークですか? –

+0

私は元の文書のパーミッションを意味します、私は明確にするための例を加えました。 – Jud

答えて

1

私はCouchDBのにかなり新しいんだけど、あなたは読んでください:

CouchDB Joins

だから私はあなたが何をする必要があるかと思いますが、複雑なキーとgroup_levelを利用することです。これを行う方法は、次のようなマップ機能を構築するために、次のようになります。

function (doc) { 
    if (doc.doctype === 'entry' && doc.forked_from) { 
     emit([doc.permissions, doc.forked_from], 1); 
    } 
} 

結果が真のグループとのこのようなもの=次のようになります。あなただけの「公共」を得るためには

{"rows":[ 
{"key":["private", "doc_1"],"value":1}, 
{"key":["public", "doc_2"],"value":1}, 
{"key":["private", "doc_3"],"value":1}, 
]} 

http://localhost/db/_design/entry/_view/getNumberForked?startkey=["public", 0]&endkey=["public", {}]&group_level=2 

これはあなたの結果を与えるだろう:文書は、あなたがgroup_levelクエリパラメータと一緒に範囲クエリを使用する必要があります

{"rows":[ 
{"key":["public", "doc_2"],"value":1} 
]} 

あなたの問題解決に役立つことを願っています。

0

あなたは_idしか持っていませんが、すでにdoc.forked_fromの存在を確認していると思いますので、doc.permissionsは利用可能である必要がありますか?

だから、きっとあなたのマップ機能は次のようになり...

function (doc) { 
    if (doc.doctype === 'entry' && doc.forked_from && doc.permissions === 'public') { 
     emit(doc.forked_from, 1); 
    } 
} 
+0

私はこれに取り組んでからずっと時間がかかりました。私は戻って簡単にテストすることはできません。しかし、私はこれが正しいとは思っていません。あなたの地図から除外された公開文書から分けられた私的な文書を数えたいと思っています。 – Jud

関連する問題