簡體   English   中英

根據鏈接文檔中的值減少CouchDB

[英]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相當陌生,但是您應該閱讀:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM