Rethinkdb在一个查询中执行多个avg

时间:2016-11-19 00:16:21

标签: rethinkdb rethinkdb-javascript

我有一个包含多个数字列的评论表。我想在一次查询中计算所有列的平均值。

如果表格如下:

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

然后我想在一个查询中获得每列的平均值。我知道我能做到:

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

在每一列上,但我想在一个查询中执行此操作并映射到一个对象。

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

1 个答案:

答案 0 :(得分: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"))
  };
})

如果记录不能包含所有字段,则可以在count操作中为每个字段分隔map,然后在do中根据字段使用它。