2017-01-30 62 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 /序列化功能,這樣可能會變得更加棘手。

也有是從您的數據庫讀取每個字符串的額外開銷,它可能會影響你的表現,如果你有非常高分貝的用法,但我認爲這是在正常情況下可以忽略不計。