2016-11-19 2 views
3

У меня есть таблица с несколькими столбцами номера. Я бы хотел, чтобы он подсчитал все столбцы в одном запросе.Rethinkdb выполнить несколько avg в одном запросе

Так, если таблица выглядит следующим образом:

{ 
    foo : 2, 
    bar : 5, 
    foobar : 10 
}, 
{ 
    foo : 4, 
    bar : 3, 
    foobar : 12 
} 

тогда я хотел бы получить СРЕДНЕЕ для каждого столбца в одном запросе. Я знаю, что я могу сделать:

r.table('stats').avg('foo') 

на каждой колонке, но я хотел бы сделать это всего за один запрос и отобразить в в только один объект.

Любые идеи о том, как это сделать?

ответ

2

Вы можете использовать map с reduce (если каждая запись в таблице есть все 3 поля):

r.table("stats").map(function(row){ 
    return {foo : row("foo"), bar : row("bar") , foobar : row("foobar"), count : 1}; 
}).reduce(function(left, right){ 
    return {foo : left("foo").add(right("foo")), bar : left("bar").add(right("bar")), foobar : left("foobar").add(right("foobar")), count : left("count").add(right("count"))}; 
}).do(function (res) { 
    return { 
    foo: res('foo').div(res("count")), 
    bar: res('bar').div(res("count")), 
    foobar: res('foobar').div(res("count")) 
    }; 
}) 

Если запись может иметь не все поля, вы можете отделить count в map операции для каждого поля, а затем в do использовать это в зависимости от поля.

+0

Спасибо, что сделал трюк. – John

Смежные вопросы