[英]Reducing CouchDB based on value from linked document
當前,我們擁有一個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"
}
當前,我們有一個map / reduce視圖,該視圖將返回文檔被分叉的次數,從而告訴我們最受歡迎的文檔是什么。
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}
]}
但是,我們只希望返回將權限設置為“ public”的文檔,以便查詢的結果如下所示:
{"rows":[
{"key":"doc_2","value":1}
]}
doc_1
不應該返回,因為它是私有的。
似乎我不能在map階段過濾結果,因為我只有文檔ID,沒有整個文檔要檢查。 我嘗試使用鏈接文檔功能將文檔添加到密鑰中,並在地圖的emit
中包含{'_id': doc.forked_from}
,但CouchDB響應“ include_docs對縮小視圖無效”。
關於如何過濾此視圖結果的任何建議?
我對CouchDB相當陌生,但是您應該閱讀:
因此,我認為您需要做的是利用復雜的鍵和group_level。 做到這一點的方法是這樣構造地圖函數:
function (doc) {
if (doc.doctype === 'entry' && doc.forked_from) {
emit([doc.permissions, doc.forked_from], 1);
}
}
結果將是類似於group = true的結果:
{"rows":[
{"key":["private", "doc_1"],"value":1},
{"key":["public", "doc_2"],"value":1},
{"key":["private", "doc_3"],"value":1},
]}
為了只獲取“公共”文檔,必須將范圍查詢與group_level查詢參數一起使用:
http://localhost/db/_design/entry/_view/getNumberForked?startkey=["public", 0]&endkey=["public", {}]&group_level=2
這將為您提供結果:
{"rows":[
{"key":["public", "doc_2"],"value":1}
]}
我希望這可以幫助您解決問題。
您說您只有_id,但是您已經檢查了doc.forked_from的存在,因此確定doc.permissions必須可用嗎?
因此,您的地圖功能肯定是...
function (doc) {
if (doc.doctype === 'entry' && doc.forked_from && doc.permissions === 'public') {
emit(doc.forked_from, 1);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.