2015-02-03 2 views

ответ

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))) - мы округлим полученное целое число до ближайшего 100 путем выполнения (по существу) x = x - (x % 100), например. 318 будет 300.
Смежные вопросы