sql >> Base de Datos >  >> NoSQL >> MongoDB

Levante la tienda BigDecimal en MongoDB

A partir de MongoDB v2.6 no hay un tipo decimal de lugares fijos. Los datos deben guardarse en un campo de un tipo diferente y la aplicación debe realizar la traducción cada vez.

Potencialmente, las librerías intermediarias podrían hacer esta traducción en lugar de su aplicación. Supongo que net.liftweb.record no.

Si un tipo doble fuera suficiente para los campos en cuestión, recomiendo cambiarlo por simplicidad. Pero suponiendo que está utilizando BigDecimal por buenas razones, existen soluciones bien conocidas. Estos son:

(1) Almacenarlo como una cadena . Puede tener cualquier precisión arbitraria. Pero ordenar o consultar coincidencias de valores exactos solo funcionará si rellena el lado izquierdo con ceros a una longitud fija cada vez. Incluso entonces, los números positivos y negativos son dos rangos diferentes en cuanto a clasificación. Los negativos deben ordenarse al revés para tener una clasificación numérica correcta. Un ejemplo del orden en que MongoDB devolverá naturalmente estos números de cadena con ceros:

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

Creo que el tipo BigDecimal tiene un constructor a partir de un valor de cadena, por lo que este podría ser el más fácil de implementar en la función de traducción de su aplicación.

(2) Almacenarlo como un largo desplazado (Int64) . La clasificación funciona, se usa menos espacio en disco, no hay problemas con negativo vs. positivo. Requiere cambiar los valores por un múltiplo fijo, lo que hace que sea un poco ilegible cuando se mira directamente en la base de datos. La precisión debe fijarse para que sea la misma para todos los valores de toda la colección; está bien para casos de uso financiero; no está bien para algunos casos de uso científico.

(3) Almacenar como un par de números , uno para cada lado del punto decimal. La clasificación requiere un poco de trabajo adicional. Si usa números Int32, la precisión se limitará a 9 dígitos a cada lado del decimal. Mirar dos columnas en la base de datos en lugar de una es un poco más de trabajo, por supuesto.

Para un ejemplo de código de Scala, encontré que el controlador reactivo para el proyecto MongoDB ha documentado tres soluciones de serialización para BigDecimal . El primero usa doble; los dos últimos adoptan otro enfoque:crean un subdocumento completo para el valor BigDecimal. Sospecho que tratar de consultar valores envueltos en subdocumentos sería complicado.

Otra caso de la vida real de un blog del equipo de desarrollo de Ebay (Morphia/Java)

PD tal vez MongoDB agregará un tipo decimal en el futuro. Hay una solicitud de función abierta que puede ver/votar - https://jira. mongodb.org/browse/SERVER-1393