我有一个包含多个数字列的评论表。我想在一次查询中计算所有列的平均值。
如果表格如下:
{
foo : 2,
bar : 5,
foobar : 10
},
{
foo : 4,
bar : 3,
foobar : 12
}
然后我想在一个查询中获得每列的平均值。我知道我能做到:
r.table('stats' ).avg( 'foo' )
在每一列上,但我想在一个查询中执行此操作并映射到一个对象。
关于如何做到这一点的任何想法?
答案 0 :(得分: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
中根据字段使用它。