我想在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函数?
答案 0 :(得分:2)
这是map-reduce的完美案例!让每个文件代表投票是我认为正确的方式,并将与CouchDB的优势一起使用。
我建议使用这样的文档结构:
{
"type": "vote",
"vote_id": "test",
"vote": 1
}
{
"type": "vote",
"vote_id": "test",
"vote": -1
}
1
/ -1
而不是“thumbs_up”或“thumbs_down”(真的没关系,你可以做任何你想做的事情,它会工作得很好)function (doc) {
if (doc.type === "vote") {
emit(doc.vote_id, doc.vote);
}
}
_sum
您的地图功能最终会得到这样的结果:
如果你减少它:
当您添加更多具有更多vote_id种类的投票文档时,您可以使用以下方式查询特定的vote_id:/:db/_design/:ddoc/_view/:view?reduce=true&group=true&key=":vote_id"