1

我有一个投票表,其中包含一些条目,例如(id、song_id、user_id 和 vote).. vote 可以包含值“like”或“dislike”

现在我想按 song_id 创建一个队列,然后从该组返回喜欢和不喜欢值的数量

r.db('songs').table('votes').groupedMapReduce(
    function(vote) { return vote('song_id')},
    function(vote) { return vote.pluck('vote')},
    function(acc, vote) {
        return ?????;
        /* 
        ** some kind of loop to get all the likes and dislikes
        ** if vote === 'like' likes++
        ** if vote === 'dislike' dislikes++
        ** return {song_id:song_id, likes:likes, dislikes:dislikes}
        */
    }
 )

希望输出如下:

[
    {song_id: 1, likes: 8, dislikes: 3},
    {song_id: 2, likes: 2, dislikes: 6},
    // and so on
]
4

1 回答 1

2

我认为这就是您正在寻找的 groupedMapReduce:

r.db('songs').table('votes').groupedMapReduce(
    function(vote) { return vote('song_id')},
    function(vote) { return r.branch(
        vote("vote").eq("like"),
        {like: 1, dislike: 0},
        {like: 0, dislike: 1}
    )},
    function(left, right) {
        return {
            like: left("like").add(right("like")),
            dislike: left("dislike").add(right("dislike"))
        }
    }
)

此外,RethinkDB 的下一个版本(计划在 1-2 周内)将替换groupedMapReduce为更好的group命令。

于 2014-03-06T19:05:02.637 回答