java.math.Bigdecimal 缺少编解码器
Monger Missing codec for java.math.Bigdecimal
正在尝试使用 Monger 将文档插入 Mongo,其中包含 Float/Big 小数
(mc/insert db "products" {:name "Shirt" :Price 300.00M })
并得到以下错误。
ERROR compojure.api.exception - Can't find a codec for class java.math.BigDecimal.
当我删除价格时,插入工作正常。
我是否缺少任何编解码器依赖项或我做错了什么?。 Google 搜索没有多大帮助。提前致谢。
MongoDB 不支持 Java 的 BigDecimal serialization/deserialization。
我最终做的是使用字符串值创建我自己的 serialization/deserialization。
因此值 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)))
只要您将这些序列化保留在您的应用程序中,一切都会顺利进行。如果您需要其他应用程序访问您的数据库,那么它们必须具有相同的 de/serialization 功能,这样可能会变得更加棘手。
从数据库中读取每个字符串也会增加开销,如果数据库使用率很高,它可能会影响性能,但我认为在正常情况下可以忽略不计。
正在尝试使用 Monger 将文档插入 Mongo,其中包含 Float/Big 小数
(mc/insert db "products" {:name "Shirt" :Price 300.00M })
并得到以下错误。
ERROR compojure.api.exception - Can't find a codec for class java.math.BigDecimal.
当我删除价格时,插入工作正常。 我是否缺少任何编解码器依赖项或我做错了什么?。 Google 搜索没有多大帮助。提前致谢。
MongoDB 不支持 Java 的 BigDecimal serialization/deserialization。 我最终做的是使用字符串值创建我自己的 serialization/deserialization。
因此值 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)))
只要您将这些序列化保留在您的应用程序中,一切都会顺利进行。如果您需要其他应用程序访问您的数据库,那么它们必须具有相同的 de/serialization 功能,这样可能会变得更加棘手。
从数据库中读取每个字符串也会增加开销,如果数据库使用率很高,它可能会影响性能,但我认为在正常情况下可以忽略不计。