2017-01-30 58 views
3

试图插入使用蒙格随着浮法/大小数文档来蒙戈在它蒙格为java.math.BigDecimal的

(MC /插入DB“产品” {缺少编解码器:价格300.00M})

,并得到下面的错误。

错误compojure.api.exception - 找不到类java.math.BigDecimal的编解码器。当我删除价格

插入正常工作。 我是否缺少任何编解码器依赖或我做错了什么?谷歌搜索没有多大帮助。提前致谢。

+0

如果您需要帮助,您确实需要发布示例代码(最小案例!)以及错误消息。 –

+0

有同样的问题 - 它似乎没有简单的解决办法,据我了解,读作[此线程(https://groups.google.com/forum/#!msg/clojure-mongodb/alg9b2mfESA/OuztuCGu5bkJ)为细节... –

+0

@AlanThompson编辑的问题。谢谢。 –

回答

1

的MongoDB不支持Java的BigDecimal的序列化/反序列化。 我最终做的是使用字符串值创建我自己的序列化/反序列化。

所以价值10123M将被存储在MongoDB的字符串bigdec:10123

所以刚才创建的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 /序列化功能,这样可能会变得更加棘手。

也有是从您的数据库读取每个字符串的额外开销,它可能会影响你的表现,如果你有非常高分贝的用法,但我认为这是在正常情况下可以忽略不计。