Intentando insertar un documento en Mongo usando Monger con un decimal flotante/grande en él
(mc/insert db "productos" {:nombre "Camisa" :Precio 300.00M })
y obtiene el siguiente error.
ERROR compojure.api.exception: no se puede encontrar un códec para la clase java.math.BigDecimal.
El inserto funciona bien cuando elimino el precio. ¿Me estoy perdiendo alguna dependencia de códec o qué estoy haciendo mal? La búsqueda en Google no ayudó mucho. Gracias de antemano.
MongoDB no es compatible con la serialización/deserialización BigDecimal de Java. Lo que terminé haciendo fue crear mi propia serialización/deserialización usando valores de cadena.
Entonces, el valor 10123M se almacenaría como la cadena bigdec:10123 en MongoDB.
Así que simplemente cree el archivo myproject.data.big-decimal y pídale una vez en algún lugar de su proyecto:
(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 es)) 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)))Mientras mantenga estas serializaciones dentro de su aplicación, las cosas funcionarán bien. Si necesita otras aplicaciones para acceder a su base de datos, entonces tendrían que tener las mismas funciones de deserialización, por lo que podría ser más complicado.
También hay una sobrecarga adicional para leer cada cadena de su db, podría afectar su rendimiento si tiene un uso muy alto de db, pero creo que es insignificante en casos normales.