加入/总结CouchDB

使用 CouchDB,我目前有一个代表一个想法的文档,你可以评价这个想法.每个想法都是一个文档,每个评级都是一个不同的文档.我这样做是为了避免在人们评价想法时出现并发访问问题.

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

一个主意:

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

评分:

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

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

我目前使用reduce函数来返回我的想法ID和他/她的评级(一个简单的评级总和):

地图:

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

降低:

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

我的问题是:我如何“加入”“想法”文档,其中减少的结果代表了该想法的评级?

解决方法

地图:

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,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来做这个伎俩.

相关文章

文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的...
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒...
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb...
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn...
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无...