2017-01-30 2 views
3

Попытка Вставьте документ в Монго, используя торговцем с поплавком/Большой Decimal в немMonger недостающий кодек для java.math.BigDecimal

(тс/вставка дб «продуктов» {: название «рубашка»: Цена 300,00M})

и получает следующую ошибку.

ERROR compojure.api.exception - Невозможно найти кодек для класса java.math.BigDecimal.

Вставка отлично работает, когда я удаляю цену. У меня отсутствует какая-либо зависимость кодека или что я делаю неправильно? Поиск в Google не очень помог. Заранее спасибо.

+0

Если вам нужна помощь, вам действительно нужно отправить образец кода (минимальный случай!) Вместе с сообщением об ошибке. –

+0

Имеет ту же проблему - кажется, у меня нет простого решения, насколько я понимаю, прочитайте [эту тему] (https://groups.google.com/forum/#!msg/clojure-mongodb/alg9b2mfESA/OuztuCGu5bkJ) для подробнее ... –

+0

@AlanThompson Отредактированный вопрос. Благодарю. –

ответ

1

MongoDB не поддерживает сериализацию/десериализацию BigDecimal Java. В результате я создал собственную сериализацию/десериализацию с использованием строковых значений.

Таким образом, значение 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))) 

Пока вы держите эти сериализации в вашем приложении, все будет работать нормально. Если вам нужны другие приложения для доступа к вашему db, тогда они должны будут иметь те же функции де-сериализации, что может стать более сложным.

Также есть дополнительные накладные расходы для чтения каждой строки из вашего db, это может повлиять на вашу производительность, если у вас очень высокое использование db, но я думаю, что это незначительно в обычных случаях.

 Смежные вопросы

  • Нет связанных вопросов^_^