【问题标题】:Join/sum with CouchDB加入/求和 CouchDB
【发布时间】:2010-01-02 21:38:18
【问题描述】:

使用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);
}

我的问题是:我如何将“想法”文档与表示想法评级的 reduce 结果“加入”?

【问题讨论】:

    标签: couchdb nosql document-oriented-db


    【解决方案1】:

    地图:

    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 来解决问题。

    【讨论】:

      【解决方案2】:

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

      简短的回答是,除了附加查询之外,您无法获得创意文档。虽然查询速度很快,因为您的投票文档中有 _id。

      如果您想返回所有投票的完整文件,以获取 cmets 或其他东西,您绝对可以这样做。只需使用 ?include_docs=true

      运行视图查询

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 2011-09-04
        • 2011-10-29
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多