sql >> Databáze >  >> NoSQL >> MongoDB

Výtahový obchod BigDecimal v MongoDB

Od MongoDB v2.6 neexistuje žádný desetinný typ s pevnými místy. Data musí být uložena v poli jiného typu a aplikace musí pokaždé provést překlad.

Potenciálně by tento překlad mohly provést zprostředkující knihovny místo vaší aplikace. Myslím, že net.liftweb.record ne.

Pokud by pro dané pole(a) postačoval dvojitý typ, doporučuji pro zjednodušení přejít na tento. Ale za předpokladu, že BigDecimal používáte z dobrých důvodů, existují dobře známá řešení. Jsou to:

(1) Uložte jej jako řetězec . Můžete mít libovolnou přesnost. Ale řazení nebo dotazování na přesné shody hodnot bude fungovat pouze tehdy, pokud levou stranu pokaždé doplníte nulami na pevnou délku. I potom jsou kladná a záporná čísla dva různé rozsahy řazení. Pro správné číselné řazení je nutné negativy třídit obráceně. Příklad příkazu MongoDB přirozeně vrátí tato čísla řetězců s nulami:

"-0000054321.9876"
"-0000100322"
"0000054321.9876"
"0000100322"

Věřím, že typ BigDecimal má konstruktor z hodnoty řetězce, takže to může být nejjednodušší implementovat do funkce překladu vaší aplikace.

(2) Uložte jej jako posunutou délku (Int64) . Řazení funguje, je využito méně místa na disku, žádné problémy s negativním v.s. pozitivní. Vyžaduje posunutí hodnot nahoru o pevný násobek, což je při přímém pohledu do databáze trochu nečitelné. Přesnost musí být stanovena tak, aby byla stejná pro všechny hodnoty v celé kolekci – OK pro případy finančního použití; není v pořádku pro některé případy vědeckého použití.

(3) Uložte jako dvojici čísel , jedna pro každou stranu desetinné čárky. Třídění vyžaduje trochu práce navíc. Pokud používáte čísla Int32, přesnost bude omezena na 9 číslic na obě strany desetinné čárky. Podívat se na dva sloupce v db místo jednoho je samozřejmě trochu více práce.

Pro příklad kódu Scala jsem zjistil, že ovladač Reactive pro projekt MongoDB zdokumentoval tři zástupná řešení serializace pro BigDecimal . První používá double; poslední dva používají ještě jiný přístup – vytvořte celý dílčí dokument pro hodnotu BigDecimal. Pokoušet se dotazovat hodnoty zabalené v dílčích dokumentech by bylo podle mě složité.

Další případ ze skutečného života z blogu vývojářského týmu Ebay (Morphia/Java)

P.S. možná MongoDB v budoucnu přidá desetinný typ. Existuje otevřený požadavek na funkci, který můžete sledovat/hlasovat - https://jira. mongodb.org/browse/SERVER-1393




  1. Jak poznám datový typ hodnoty daného klíče?

  2. Jak aktualizuji konkrétní klíč v dílčím dokumentu MongoDB pomocí Sails.js &Waterline?

  3. mongoDB/mongoose:jedinečný, pokud není null

  4. Jak naplnit mangusty velkým souborem dat