試圖插入使用蒙格隨着浮法/大小數文檔來蒙戈在它蒙格爲java.math.BigDecimal的
(MC /插入DB「產品」 {缺少編解碼器:價格300.00M})
,並得到下面的錯誤。
錯誤compojure.api.exception - 找不到類java.math.BigDecimal的編解碼器。當我刪除價格
插入正常工作。 我是否缺少任何編解碼器依賴或我做錯了什麼?谷歌搜索沒有多大幫助。提前致謝。
試圖插入使用蒙格隨着浮法/大小數文檔來蒙戈在它蒙格爲java.math.BigDecimal的
(MC /插入DB「產品」 {缺少編解碼器:價格300.00M})
,並得到下面的錯誤。
錯誤compojure.api.exception - 找不到類java.math.BigDecimal的編解碼器。當我刪除價格
插入正常工作。 我是否缺少任何編解碼器依賴或我做錯了什麼?谷歌搜索沒有多大幫助。提前致謝。
的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 /序列化功能,這樣可能會變得更加棘手。
也有是從您的數據庫讀取每個字符串的額外開銷,它可能會影響你的表現,如果你有非常高分貝的用法,但我認爲這是在正常情況下可以忽略不計。
如果您需要幫助,您確實需要發佈示例代碼(最小案例!)以及錯誤消息。 –
有同樣的問題 - 它似乎沒有簡單的解決辦法,據我瞭解,讀作[此線程(https://groups.google.com/forum/#!msg/clojure-mongodb/alg9b2mfESA/OuztuCGu5bkJ)爲細節... –
@AlanThompson編輯的問題。謝謝。 –