MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Levante o armazenamento BigDecimal no MongoDB


A partir do MongoDB v2.6 não há nenhum tipo decimal de casas fixas. Os dados devem ser salvos em um campo de um tipo diferente e o aplicativo deve realizar a tradução sempre.

Potencialmente, as bibliotecas intermediárias poderiam fazer essa tradução em vez de sua aplicação. Acho que net.liftweb.record não.

Se um tipo duplo for suficiente para o(s) campo(s) em questão, recomendo mudar para isso para simplificar. Mas supondo que você esteja usando BigDecimal por boas razões, existem soluções alternativas bem conhecidas. Estes são:

(1) Armazená-lo como uma string . Você pode ter qualquer precisão arbitrária. Mas classificar ou consultar correspondências de valor exato só funcionará se você preencher o lado esquerdo com zeros em um comprimento fixo todas as vezes. Mesmo assim, números positivos e negativos são dois intervalos diferentes em termos de classificação. Os negativos precisam ser classificados ao contrário para ter a classificação numérica correta. Um exemplo da ordem MongoDB retornará naturalmente esses números de string preenchidos com zeros:
"-0000054321.9876"
"-0000100322"
"0000054321.9876"
"0000100322"

Acredito que o tipo BigDecimal tenha um construtor de um valor de string, portanto, isso pode ser o mais fácil de implementar na função de tradução do seu aplicativo.

(2) Armazene-o como shifted long (Int64) . A classificação funciona, menos espaço em disco é usado, sem problemas com v.s negativos. positivo. Requer o deslocamento dos valores por um múltiplo fixo, o que torna um pouco ilegível ao olhar diretamente para o banco de dados. A precisão deve ser fixada para ser a mesma para todos os valores em toda a coleção - OK para casos de uso financeiro; não OK para alguns casos de uso científico.

(3) Armazenar como um par de números , um para cada lado do ponto decimal. A classificação requer um pouco de trabalho extra. Se estiver usando números Int32, a precisão será limitada a 9 dígitos em cada lado do decimal. Observar duas colunas no banco de dados em vez de uma é um pouco mais trabalhoso, é claro.

Para um exemplo de código Scala, descobri que o driver Reativo para o projeto MongoDB documentou três soluções alternativas de serialização para BigDecimal . O primeiro usa duplo; os dois últimos adotam outra abordagem - criar um subdocumento inteiro para o valor BigDecimal. Tentar consultar valores envoltos em subdocumentos seria complicado, suspeito.

Outro caso da vida real de um blog da equipe de desenvolvimento do Ebay (Morphia/Java)

P.S. talvez o MongoDB adicione um tipo decimal no futuro. Há uma solicitação de recurso aberta que você pode assistir/votar - https://jira. mongodb.org/browse/SERVER-1393