Магазин лифтов BigDecimal в MongoDB

Я занимаюсь разработкой сайта электронной коммерции в Lift с MongoDB

Мне нужно хранить некоторые данные о ценах на продукцию

У меня вопрос такой:

Какой тип поля мне следует использовать в MongoDB, если я хочу хранить тип данных BigDecimal

В маппере есть поле типа: MappedDecimal, но

в net.liftweb.mongodb.record.field нет эквивалента

Как я могу хранить эту информацию?

Спасибо всем за внимание и помощь

1 ответ

Начиная с версии MongoDB v2.6 десятичный тип с фиксированными местами отсутствует. Данные должны быть сохранены в поле другого типа, и приложение должно выполнять перевод каждый раз.

Потенциально посредники могли бы сделать этот перевод вместо вашего заявления. Я думаю, что net.liftweb.record не делает.

Если для рассматриваемого поля будет достаточно двойного типа, я рекомендую изменить его для простоты. Но при условии, что вы используете BigDecimal по уважительным причинам, есть известные обходные пути. Это:

(1) Сохраните его как строку. Вы можете иметь любую произвольную точность. Но сортировка или запрос на точное совпадение значений будет работать только в том случае, если вы каждый раз добавляете левые части с нулями до фиксированной длины. Даже тогда положительные и отрицательные числа являются двумя различными диапазонами сортировки. Негативы должны быть отсортированы в обратном порядке, чтобы иметь правильную числовую сортировку. Пример порядка MongoDB, естественно, вернет эти числа с нулями:

"-0000054321.9876"
"-0000100322"
"0000054321.9876"
"0000100322"

Я считаю, что тип BigDecimal имеет конструктор из строкового значения, так что это может быть проще всего реализовать в функции перевода вашего приложения.

(2) Сохраните его как сдвинутый длинный (Int64). Сортировка работает, меньше места на диске, проблем с отрицательным и положительным нет. Требуется смещение значений на фиксированное кратное, что делает его нечитаемым при непосредственном взгляде на базу данных. Точность должна быть фиксированной, чтобы быть одинаковой для всех значений во всей коллекции - ОК для финансовых случаев использования; не хорошо для некоторых научных случаев использования.

(3) Хранить в виде пары чисел, по одному на каждую сторону десятичной точки. Сортировка требует дополнительной работы. При использовании чисел Int32 точность будет ограничена 9 цифрами по обе стороны от десятичной дроби. Глядя на две колонки в БД вместо одной, конечно, немного больше работы.

В качестве примера кода Scala я обнаружил, что драйвер Reactive для проекта MongoDB задокументировал три обходных пути для сериализации для BigDecimal. Первый использует двойной; последние два используют еще один подход - создать целый поддокумент для значения BigDecimal. Я подозреваю, что попытка запросить значения, вложенные в поддокументы, будет непростой задачей.

Еще один реальный пример из блога команды разработчиков Ebay (Morphia / Java)


PS возможно MongoDB добавит десятичный тип в будущем. Для этого есть открытый запрос, который вы можете посмотреть / upvote - https://jira.mongodb.org/browse/SERVER-1393

Другие вопросы по тегам