Я хочу сгруппировать документы в rethinkdb по диапазону цен (0-100, 100-200, 200-300 и т. Д.) Вместо одного значения цены. Как мне это сделать?rethinkdb: групповые документы по ценовому диапазону
ответ
К сожалению, 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
.
- 1. opencart - Получить продукты по ценовому диапазону
- 2. Drupal 7, Ubercart, Поиск товаров по ценовому диапазону
- 3. Поиск продуктов по ценовому диапазону, используя поиск по блоку по умолчанию
- 4. Преобразование и групповые документы в MongoDB
- 5. Метеор: групповые документы и публикация объекта
- 6. Групповые документы с использованием подстроки поля
- 7. Rethinkdb - как восстановить удаленные удаленные документы
- 8. Сортировать по производителю в RethinkDB
- 9. Как я могу сделать групповые групповые групповые опрокидывания по умолчанию?
- 10. rethinkDB: группа по частному значению
- 11. Группировка по диапазону с использованием linq
- 12. Групповые строки по сходству
- 13. Групповые записи по времени
- 14. Групповые строки по префиксу
- 15. Групповые объекты по датам
- 16. Групповые сообщения по совпадению?
- 17. Массив разделен по диапазону?
- 18. Диапазон диапазонов по диапазону?
- 19. Перебор массива по диапазону
- 20. Инициализировать массив по диапазону
- 21. Многомерный поиск по диапазону
- 22. MySQL - группа по диапазону
- 23. Цикл по диапазону дат
- 24. Ограничение по диапазону
- 25. Поиск по нечетному диапазону
- 26. MarkLogic Запрос по диапазону
- 27. Mysql сортировать по диапазону
- 28. Деление по диапазону значений
- 29. Как найти документы старше или старше X в RethinkDB?
- 30. Как получить первичные документы при вызове cursor.changes() с RethinkDB