sql >> Database teknologi >  >> NoSQL >> MongoDB

Løft butik BigDecimal i MongoDB

Fra MongoDB v2.6 er der ingen decimaltype med faste pladser. Dataene skal gemmes i et felt af en anden type, og applikationen skal udføre oversættelse hver gang.

Potentielt kunne de mellemliggende libs udføre denne oversættelse i stedet for din ansøgning. Det gør net.liftweb.record vel ikke.

Hvis en dobbelt type ville være tilstrækkelig for det eller de pågældende felter, anbefaler jeg at ændre til det for nemheds skyld. Men forudsat at du bruger BigDecimal af gode grunde, er der velkendte løsninger. Disse er:

(1) Gem det som en streng . Du kan have enhver vilkårlig præcision. Men sortering eller forespørgsel efter nøjagtige værdimatches vil kun fungere, hvis du udfylder venstre side med nuller til en fast længde hver gang. Selv da er positive og negative tal to forskellige intervaller sorteringsmæssigt. Negativerne skal sorteres omvendt for at have korrekt numerisk sortering. Et eksempel på rækkefølgen MongoDB vil naturligvis returnere disse nulpolstrede strengnumre:

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

Jeg tror, ​​at BigDecimal-typen har en konstruktør fra en strengværdi, så dette kan være den nemmeste at implementere i din applikations oversættelsesfunktion.

(2) Gem den som en forskudt lang (Int64) . Sortering virker, der bruges mindre diskplads, ingen problemer med negativ v.s. positiv. Kræver at flytte værdierne op med et fast multiplum, hvilket gør en smule ulæselig, når man ser direkte på databasen. Præcisionen skal fastsættes, så den er den samme for alle værdierne i hele samlingen - OK til tilfælde af økonomisk brug; ikke OK for nogle videnskabelige brugstilfælde.

(3) Gem som et par numre , en for hver side af decimaltegnet. Sortering kræver lidt ekstra arbejde. Hvis du bruger Int32-tal, vil præcisionen være begrænset til 9 cifre på hver side af decimalen. At se på to kolonner i db'en i stedet for en er selvfølgelig lidt mere arbejde.

For et eksempel på en Scala-kode fandt jeg, at Reactive driver for MongoDB-projektet har dokumenteret tre serialiseringsløsninger til BigDecimal . Den første bruger dobbelt; de to sidstnævnte tager endnu en tilgang - opret et helt underdokument til BigDecimal-værdi. Jeg formoder, at det ville være vanskeligt at prøve at forespørge på værdier pakket ind i underdokumenter.

En anden sag fra det virkelige liv fra en Ebay-udviklerteamblog (Morphia/Java)

P.S. måske vil MongoDB tilføje en decimaltype i fremtiden. Der er en åben funktionsanmodning om det, som du kan se/stemme op - https://jira. mongodb.org/browse/SERVER-1393




  1. MongoDB, MapReduce og sortering

  2. Hvordan finder man alt i mongoosejs?

  3. Hvordan man kan fremskrive, om felt eksisterer

  4. Jedis - Hvornår skal returnBrokenResource() bruges