MongoDB не поддерживает сериализацию/десериализацию BigDecimal Java. В результате я создал собственную сериализацию/десериализацию с использованием строковых значений.
Таким образом, значение 10123M
будет храниться в виде строки bigdec:10123
в MongoDB.
Так просто создать файл Clojure myproject.data.big-decimal
и требуют его один раз где-то в вашем проекте:
(ns myproject.data.big-decimal
(:require [monger.conversion :refer :all]
[clojure.string :as str]))
(def prefix "bigdec:")
(def prefix-count (count prefix))
(defn big-dec-serialize [value]
(str prefix value))
(defn big-dec-deserialize [s]
(if (and (> (count s) prefix-count)
(= (subs s 0 prefix-count) prefix))
(try
(bigdec (subs s prefix-count (count s)))
(catch Exception e
s))
s))
(extend-protocol ConvertToDBObject
java.math.BigDecimal
(to-db-object [^java.math.BigDecimal nr]
(big-dec-serialize nr)))
(extend-protocol ConvertFromDBObject
String
(from-db-object [^String input keywordize]
(big-dec-deserialize input)))
Пока вы держите эти сериализации в вашем приложении, все будет работать нормально. Если вам нужны другие приложения для доступа к вашему db, тогда они должны будут иметь те же функции де-сериализации, что может стать более сложным.
Также есть дополнительные накладные расходы для чтения каждой строки из вашего db, это может повлиять на вашу производительность, если у вас очень высокое использование db, но я думаю, что это незначительно в обычных случаях.
Если вам нужна помощь, вам действительно нужно отправить образец кода (минимальный случай!) Вместе с сообщением об ошибке. –
Имеет ту же проблему - кажется, у меня нет простого решения, насколько я понимаю, прочитайте [эту тему] (https://groups.google.com/forum/#!msg/clojure-mongodb/alg9b2mfESA/OuztuCGu5bkJ) для подробнее ... –
@AlanThompson Отредактированный вопрос. Благодарю. –