Mongodb Monger缺少java.math.Bigdecimal的编解码器

Mongodb Monger缺少java.math.Bigdecimal的编解码器,mongodb,clojure,monger,Mongodb,Clojure,Monger,尝试使用带有浮点/大小数的Monger将文档插入Mongo (mc/插入db“产品”{:名称“衬衫”:价格3亿美元) 并获取以下错误 错误compojure.api.exception-找不到类java.math.BigDecimal的编解码器 当我删除价格时,插入效果很好。 我是否缺少任何编解码器依赖项,或者我做错了什么?。谷歌搜索没有多大帮助。提前谢谢 MongoDB不支持Java的BigDecimal序列化/反序列化。 我最后做的是使用字符串值创建自己的序列化/反序列化 因此,值10123

尝试使用带有浮点/大小数的Monger将文档插入Mongo

(mc/插入db“产品”{:名称“衬衫”:价格3亿美元)

并获取以下错误

错误compojure.api.exception-找不到类java.math.BigDecimal的编解码器

当我删除价格时,插入效果很好。
我是否缺少任何编解码器依赖项,或者我做错了什么?。谷歌搜索没有多大帮助。提前谢谢

MongoDB不支持Java的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)))
只要你在应用程序中保持这些序列化,事情就会顺利进行。如果您需要其他应用程序来访问数据库,那么它们必须具有相同的反序列化功能,因此这可能会变得更加棘手


另外,从数据库中读取每个字符串会增加额外的开销,如果数据库使用率很高,可能会影响性能,但我认为在正常情况下可以忽略不计。

如果需要帮助,您确实需要发布示例代码(最小情况!)与错误消息一起。有同样的问题-据我所知,似乎没有简单的解决方案,请阅读详细信息…@AlanThompson编辑了该问题。谢谢