sql >> Databasteknik >  >> NoSQL >> MongoDB

Lyftbutik BigDecimal i MongoDB

Från och med MongoDB v2.6 finns det ingen decimaltyp med fasta ställen. Data måste sparas i ett fält av en annan typ och applikationen måste utföra översättning varje gång.

Eventuellt kan mellanhandslibs göra denna översättning istället för din ansökan. Jag antar att net.liftweb.record inte gör det.

Om en dubbel typ skulle räcka för fältet/fälten i fråga rekommenderar jag att du ändrar till det för enkelhets skull. Men förutsatt att du använder BigDecimal av goda skäl finns det välkända lösningar. Dessa är:

(1) Lagra den som en sträng . Du kan ha vilken godtycklig precision som helst. Men att sortera eller fråga efter exakta värdematchningar fungerar bara om du fyller på vänster sida med nollor till en fast längd varje gång. Även då är positiva och negativa tal två olika intervall sorteringsmässigt. Negativen måste sorteras omvänt för att få korrekt numerisk sortering. Ett exempel på ordningen MongoDB kommer naturligtvis att returnera dessa nollstoppade strängnummer:

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

Jag tror att typen BigDecimal har en konstruktor från ett strängvärde, så detta kan vara det enklaste att implementera i din applikations översättningsfunktion.

(2) Lagra den som en skiftad lång (Int64) . Sortering fungerar, mindre diskutrymme används, inga problem med negativ v.s. positiv. Kräver att värdena flyttas upp med en fast multipel vilket gör det lite oläsligt när man tittar på databasen direkt. Precisionen måste fastställas för att vara densamma för alla värden i hela samlingen - OK för ekonomiska användningsfall; inte OK för vissa vetenskapliga användningsfall.

(3) Lagra som ett par siffror , en för vardera sidan av decimalkomma. Sorteringen kräver lite extra arbete. Om du använder Int32-siffror kommer precisionen att vara begränsad till 9 siffror på vardera sidan av decimalen. Att titta på två kolumner i db istället för en är förstås lite mer jobb.

För ett exempel på Scala-kod hittade jag att Reactive-drivrutinen för MongoDB-projektet har dokumenterat tre serialiseringslösningar för BigDecimal . Den första använder dubbel; de två sistnämnda tar ytterligare ett tillvägagångssätt - skapa ett helt underdokument för BigDecimal-värde. Att försöka fråga efter värden som är insvept i underdokument skulle vara knepigt misstänker jag.

En annan verkliga fall från en blogg för utvecklarteam på Ebay (Morphia/Java)

P.S. kanske MongoDB kommer att lägga till en decimaltyp i framtiden. Det finns en öppen funktionsbegäran för det som du kan se/rösta upp - https://jira. mongodb.org/browse/SERVER-1393




  1. Mongo DB-aggregationsmatrisstorlek större än matchning

  2. mongoexport syntax felmeddelande

  3. MongoDB-frågor med null-värde

  4. redis timeout med predis