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

时间:2017-01-30 10:52:12

标签: mongodb clojure monger

尝试使用带有Float / Big Decimal的Monger将文档插入Mongo

  

(mc / insert db“products”{:name“Shirt”:Price 300.00M})

并获得以下错误。

  

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

当我删除Price时,插入工作正常。 我错过任何编解码器依赖或我做错了什么?谷歌搜索没有多大帮助。提前致谢。

1 个答案:

答案 0 :(得分:1)

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)))

只要您将这些序列化保留在您的应用中,事情就可以了。如果您需要其他应用程序来访问您的数据库,那么它们必须具有相同的de / serialization函数,因此可能会变得更加棘手。

此外,还有一个额外的开销,用于从数据库中读取每个字符串,如果你的数据库使用率非常高,它可能会影响你的性能,但我认为在正常情况下它可以忽略不计。