CouchDB减少在这种情况下有用的功能?

时间:2013-05-11 12:15:51

标签: couchdb

我想在CouchDB中存储投票。为了解决在一个文档中增加字段并进行数百万次修订的问题,每个投票将是一个单独的文档:

{
  _id: "xyz"
  type: "thumbs_up"
  vote_id: "test"
}

所以实际文件本身就是投票。我想要的结果基本上是一个数组:vote_id,sumOfThumbsUp,sumOfThumbsDown

现在我认为我的地图功能需要看起来像:

if(type=="thumbs_up" | type =="thumbs_down"){
    emit(vote_id, type)
}

现在这里有点我无法弄清楚要做什么,我应该建立一个reduce函数以某种方式总结投票类型,记住有两种类型的投票。

或者我应该从map函数中获取已经发生的内容并将其直接放入数组中进行处理,完全忽略reduce函数?

1 个答案:

答案 0 :(得分:2)

这是map-reduce的完美案例!让每个文件代表投票是我​​认为正确的方式,并将与CouchDB的优势一起使用。

我建议使用这样的文档结构:

文档

给予好评

{
  "type": "vote",
  "vote_id": "test",
  "vote": 1
}

DOWNVOTE

{
  "type": "vote",
  "vote_id": "test",
  "vote": -1
}
  • 我会使用文档类型“投票”,因此您可以在数据库中包含其他文档类型(如投票类别信息,用户信息等)
  • 我保持“vote_id”相同
  • 我创建了名为“vote”的值字段,只使用了1 / -1而不是“thumbs_up”或“thumbs_down”(真的没关系,你可以做任何你想做的事情,它会工作得很好)

视图

地图

function (doc) {
    if (doc.type === "vote") {
        emit(doc.vote_id, doc.vote);
    }
}

减少

_sum

您的地图功能最终会得到这样的结果:

map results

如果你减少它:

reduce results

当您添加更多具有更多vote_id种类的投票文档时,您可以使用以下方式查询特定的vote_id:/:db/_design/:ddoc/_view/:view?reduce=true&group=true&key=":vote_id"