1

我想在 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 函数?

4

1 回答 1

2

这是 map-reduce 的完美案例!在我看来,让每个文档代表一个投票是正确的方式,并且将与 CouchDB 的优势相结合。

我会推荐这样的文档结构:

文件

点赞

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

否决票

{
  "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 函数得到这样的结果:

地图结果

如果你减少它:

减少结果

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

于 2013-05-11T19:12:55.700 回答