加入/总结CouchDB

时间:2009-12-23 05:31:06

标签: couchdb nosql document-oriented-db

使用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 个答案:

答案 0 :(得分: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 :(得分:1)

首先,请不要创建自己的_id,让CouchDB为您创建一个uuid。它好多了,我向你保证:)

简短的回答是,除了额外的查询之外,你无法获得任何想法文档。虽然您的投票文档中包含_id,但查询速度非常快。

如果你想要返回所有选票的完整文件,为了获取评论或其他东西,你肯定可以这样做。只需使用?include_docs = true

运行视图查询