【问题标题】:Monger Missing codec for java.math.BigdecimalMonger 缺少 java.math.Bigdecimal 的编解码器
【发布时间】:2017-01-30 10:52:12
【问题描述】:

尝试使用带有浮点数/大十进制的 Monger 将文档插入到 Mongo

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

并得到以下错误。

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

当我删除价格时,插件工作正常。 我是否缺少任何编解码器依赖项或我做错了什么?谷歌搜索没有太大帮助。提前致谢。

【问题讨论】:

  • 如果您需要帮助,您确实需要发布示例代码(最小的情况!)以及错误消息。
  • 遇到了同样的问题 - 据我了解,似乎没有简单的解决方案,请阅读 this thread 了解详情...
  • @AlanThompson 编辑了问题。谢谢。

标签: mongodb clojure monger


【解决方案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)))

只要您将这些序列化保留在您的应用程序中,一切都会顺利进行。如果您需要其他应用程序来访问您的数据库,那么它们必须具有相同的反序列化功能,这可能会变得更加棘手。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多