rethinkdb:按价格范围分组文档

时间:2015-02-03 09:22:52

标签: group-by aggregate rethinkdb

我想按价格范围(0-100,100-200,200-300等)在rethinkdb中对文档进行分组,而不是单个价格值。我该怎么做?

1 个答案:

答案 0 :(得分:1)

不幸的是,ReQL目前不支持舍入(see github issue #866),但你可以通过一些小麻烦得到类似的东西。

首先,如果您要定期或在大型数据集上运行,我建议将其作为给定表的索引。我在这里的功能并不是最有效的,因为我们不能对数字进行舍入,索引可以帮助减轻这一点。

这些代码示例都是Python,因为我没有看到任何引用的特定语言。要创建索引,请执行以下操作:

r.db('foo').table('bar').index_create('price_range',
    lambda row: row['price'].coerce_to('STRING').split('.')[0].coerce_to('NUMBER')
                   .do(lambda x: x.sub(x.mod(100)))).run()

这将根据0表示[0-100)100[100-200)的价格创建二级索引,依此类推。在这一点上,分组是微不足道的:

r.db('foo').table('bar').group(index='price_range').run()

如果您真的不想创建索引,可以在单个查询中group期间完成映射:

r.db('foo').table('bar').group(
    lambda row: row['price'].coerce_to('STRING').split('.')[0].coerce_to('NUMBER')
                   .do(lambda x: x.sub(x.mod(100)))).run()

此查询非常简单,但要记录正在进行的操作:

  • coerce_to('STRING') - 我们获取数字的字符串表示,例如318.12变为"318.12"
  • split('.') - 我们在小数点上拆分字符串,例如"318.12"。变为["318", "12"]。如果没有小数点,其他一切都应该有效。
  • [0] - 我们取分割字符串的第一个值,这相当于向下舍入的原始数字。例如"318"
  • coerce_to('NUMBER') - 我们将字符串转换回整数,这允许我们对它进行模运算,以便我们可以舍入,例如"318"变为318
  • .do(lambda x: x.sub(x.mod(100))) - 我们通过运行(基本上)x = x - (x % 100)将结果整数向下舍入到最接近的100,例如318变为300