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