首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于java.math.Bigdecimal的Monger缺失编解码器

用于java.math.Bigdecimal的Monger缺失编解码器
EN

Stack Overflow用户
提问于 2017-01-30 10:52:12
回答 1查看 1.6K关注 0票数 3

尝试使用带有浮动/大十进制的Monger向Mongo插入文档

(mc/插入db "products“{:name”恤“:Price 300.00M })

并获取以下错误。

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

当我删除“价格”时,插入可以正常工作。我是不是漏掉了编解码器的依赖,或者我做错了什么?谷歌搜索并没有多大帮助。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-25 10:41:28

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

因此,值10123M将作为字符串bigdec:10123存储在MongoDB中。

因此,只需在项目中的某个地方创建clojure文件myproject.data.big-decimal并要求它一次:

代码语言:javascript
复制
(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,那么它们必须具有相同的反/序列化功能,这样就会变得更加棘手。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41934068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档