2016-11-19 36 views
3

我有一个包含多个数字列的查看表。我想在一个查询中计算他所有列的平均值。Rethinkdb在一个查询中执行多个平均值

因此,如果表如下所示:

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

的话,我想获得每列的平均在一个查询。我知道我可以这样做:

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

对每一列,但我想这样做在一个查询和映射到只有一个对象。

有关如何做到这一点的任何想法?

回答

2

您可以使用mapreduce(如果表中的每个记录了所有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")) 
    }; 
}) 

如果记录可以有不是所有的字段,你可以在map操作分隔每个字段count,然后在do根据领域使用它。

+0

谢谢你,这个伎俩。 – John