rethinkdb: группировка по идентификатору и возврат счетчика по другому атрибуту

У меня есть таблица с голосами, в которых есть такие записи, как (id, song_id, user_id и голосование). Голос может содержать значение «нравится» или «не нравится».

теперь я хочу создать очередь, которая группируется по 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
]

person Thomas Carlsen    schedule 06.03.2014    source источник


Ответы (1)


Я думаю, что это 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.

person neumino    schedule 06.03.2014
comment
использовал r.branch в функции сокращения.. не думал использовать его в функции отображения - person Thomas Carlsen; 06.03.2014