用CouchDB连接/求和

用CouchDB连接/求和,couchdb,nosql,document-oriented-db,Couchdb,Nosql,Document Oriented Db,使用,我目前有一个代表想法的文档,您可以对这个想法进行评分。每个想法都是一个文件,每个评级都是一个不同的文件。我这样做是为了在人们对一个想法进行评级时避免并发访问问题 我的文档看起来是这样的(我简化了它们): 一个想法: { "_id": "idea1", "title": "A great idea" } 评级: { "_id": "rating1", "rating": 1, "author": "author1" } { "_id": "rating2", "rating

使用,我目前有一个代表想法的文档,您可以对这个想法进行评分。每个想法都是一个文件,每个评级都是一个不同的文件。我这样做是为了在人们对一个想法进行评级时避免并发访问问题

我的文档看起来是这样的(我简化了它们):

一个想法:

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

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

{
 "_id": "rating2",
 "rating": 1,
 "author": "author2"
}
我目前使用reduce函数返回想法id和他/她的评分(评分的简单总和):

地图:

减少:

function(keys, values, rereduce) {
  return sum(values);
}
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;
}

我的问题是:我如何“加入”这个“创意”文档,并使用代表创意评级的reduce结果?

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

简单的回答是,除了一个额外的查询之外,您无法获取idea文档。尽管查询速度很快,因为您的投票文档中有_id

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

映射运行视图查询:

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) {
  return sum(values);
}
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;
}
函数(键、值、返回值){
var i,l,ret={idea:null,rating:0};
对于(i=0,l=values.length;i
另一个选择是这样做