2009-12-23 87 views
4

使用CouchDB,我目前有一個文件代表一個想法,您可以評價這個想法。每個想法都是一個文件,每個評級都是不同的文件。我這樣做是爲了避免在人們評估一個想法時出現併發訪問問題。加入/與CouchDB總和

我的文件看起來像(我已經簡化了它們):

一個想法:

{ 
"_id": "idea1", 
"title": "A great idea" 
} 

等級:

{ 
"_id": "rating1", 
"rating": 1, 
"author": "author1" 
} 

{ 
"_id": "rating2", 
"rating": 1, 
"author": "author2" 
} 

我目前使用的是減少函數返回我的想法身份證和他/她的評級(簡單的評分總和):

地圖:

function(doc) { 
    if (doc.type == "rating") 
    emit(doc.idea_id, doc.rating);  
} 

減少:

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

我的問題是:我怎麼可能「加入」的「理念」的文件與代表等級爲理念的減少的結果?

回答

7

地圖運行視圖查詢:

function(doc) { 
    switch (doc.type) { 
     case "idea": emit(doc._id,  ["idea", doc]);   break; 
     case "rating": emit(doc.idea_id, ["rating", doc.rating]); break; 
    } 
} 

減少:

function(keys, values, rereduce) { 
    var i, l, ret = {idea:null, rating:0}; 

    for (i = 0, l = values.length; i < l; ++i) { 
     switch (values[i][0]) { 
      case "idea": ret.idea = values[i][1]; break; 
      case "rating": ret.rating += values[i][1]; break; 
     } 
    } 

    return ret; 
} 

另一種選擇是use view collation這樣的伎倆。

1

首先,請不要創建自己的_id,讓CouchDB爲您創建一個uuid。這是好多了,我保證你:)

簡短的答案是,你不能得到任何其他查詢以外的想法文檔。儘管查詢速度很快,因爲您的投票文件中有_id。

如果您想要返回所有選票的完整文檔,以便獲取評論或其他內容,您絕對可以這樣做。 ?只是include_docs =真