尝试使用带有浮动/大十进制的Monger向Mongo插入文档
(mc/插入db "products“{:name”恤“:Price 300.00M })
并获取以下错误。
错误compojure.api.exception -找不到类java.math.BigDecimal的编解码器。
当我删除“价格”时,插入可以正常工作。我是不是漏掉了编解码器的依赖,或者我做错了什么?谷歌搜索并没有多大帮助。提前谢谢。
发布于 2017-04-25 10:41:28
MongoDB不支持BigDecimal的序列化/反序列化。我最后所做的是使用字符串值创建自己的序列化/反序列化。
因此,值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,那么它们必须具有相同的反/序列化功能,这样就会变得更加棘手。
此外,从数据库读取每个字符串也会增加开销,如果数据库使用率很高,则会影响性能,但我认为在正常情况下可以忽略不计。
https://stackoverflow.com/questions/41934068
复制相似问题