从rethinkdb获取多个平均值和计数的最有效方法

The most efficient way of obtaining multiple averages and counts from rethinkdb

我正在创建一个 Web 应用程序,它从表单中收集信息,将它们(例如年龄、身高和体重)插入 rethinkdb 数据库,然后通过 socket.io 显示简单的描述性统计信息.

目前,我正在使用 r.expr() 到 运行 多个查询,例如

r.expr({
mean1: r.db(…).table(…).avg(…),
mean2: r.db(…).table(…).group(…).avg(…).mul(10).round().div(10).ungroup(),
count: r.db(…).table(…).count()
}).run(conn, (err, res) => {
...

构建一个包含我感兴趣的计数和平均值的对象,然后使用 io.emit() 将它们发送到客户端进行显示,每次添加新条目时都会更新。

这对我来说看起来不是很有效,我猜有更好的方法可以做到这一点——也许只需要一个查询——但我对 ReQL 和查询语言非常缺乏经验一般。

此外,有没有比我上面做的更好的方法来进行任意精度的舍入或更复杂的数值运算?

要一次执行多个归约,您可以手动将它们拆分为单独的 mapreduce 操作。类似于:

r.table(...).map(
    row => ({
        count: 1,
        sum: row('a'),
        groups: r.object(row('group'), {count: 1, sum: r.row('a')})
    })
).reduce(
    (left, right) => ({
        count: left('count').add(right('count')),
        sum: left('sum').add(right('sum')),
        groups: left.keys().setUnion(right.keys()).map(
                key => [key, {
                    count: left(key)('count').default(0).add(right(key)('count').default(0)),
                    sum: left(key)('sum').default(0).add(right(key)('sum').default(0))
                }]
            ).coerceTo('object')
    })
).do(
    res => ({
        count: res('count'),
        mean1: res('sum').div(res('count')),
        mean2: res('groups').coerceTo('array').map(
            pair => [pair(0), pair(1).do(x => x('sum').div(x('count')).mul(10).round().div(10)]
    }).coerceTo('object')
)

它可能不会更有效,但可以进一步优化。

您可以执行more complex mathematical operations using r.js