使用CouchDB进行连接/求和

4
使用CouchDB,我目前有一个代表想法的文档,您可以对此想法进行评分。每个想法都是一个文档,每个评分都是一个不同的文档。我这样做是为了避免在人们评分时出现并发访问问题。
我的文档看起来像这样(我已经简化了它们):
一个想法:
{
 "_id": "idea1",
 "title": "A great idea"
}

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

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

我目前使用reduce函数来返回想法的ID和他/她的评分(评分的简单总和):
映射:
function(doc) {
  if (doc.type == "rating")
    emit(doc.idea_id, doc.rating);    
}

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

我的问题是:我该如何将“想法”文档与表示想法评分的缩减结果“连接”起来?
2个回答

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;
}

另一个选项是使用视图排序来完成这个技巧。

1

首先,请不要创建自己的_id,让CouchDB为您创建uuid。我向您保证,这样做会更好 :)

简短的回答是,除了使用额外的查询之外,您无法获取想法文档。尽管查询非常快,因为您在投票文档中有_id。

如果您想返回所有投票的完整文档,以便获取评论或其他内容,您肯定可以这样做。只需使用?include_docs=true运行视图查询即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接