Saltar al contenido

Cómo usar el tipo decimal en MongoDB

Indagamos en distintos sitios para de esta forma mostrarte la solución para tu duda, en caso de inquietudes puedes dejar tu inquietud y te respondemos con mucho gusto, porque estamos para ayudarte.

Solución:

MongoDB no admite correctamente decimales hasta MongoDB v3.4. Antes de esta versión, almacenaba decimales como cadenas para evitar errores de precisión.

Anterior v3.4
Almacene decimales como cadenas, pero esto evita las operaciones aritméticas. Operadores como $min, $avg, … no estará disponible. Si la precisión no es gran cosa, es posible que pueda cambiar a double.

v3.4+
Debe asegurarse de que se cumplen las siguientes condiciones previas true:

  • El servidor MongoDB debe ser al menos v3.4.
  • MongoCSharpDriver debe ser al menos v2.4.3.
  • La base de datos debe tener featureCompatibilityVersion ajustado a '3.4'. Si su base de datos ha sido creada por una versión anterior de MongoDB y ha actualizado su servidor a v3.4, es posible que su base de datos aún esté en una versión anterior.

Si tiene todas las propiedades configuradas, registre los siguientes serializadores para usar el decimal128 tipo:

BsonSerializer.RegisterSerializer(typeof(decimal), new DecimalSerializer(BsonType.Decimal128));
BsonSerializer.RegisterSerializer(typeof(decimal?), new NullableSerializer(new DecimalSerializer(BsonType.Decimal128)));

Recientemente me encontré con este problema. Lo resolví simplemente anotando mi objeto así:

[BsonRepresentation(BsonType.Decimal128)]
public decimal Price get; set;

Tuve problemas para usar el RegisterSerializer enfoque ya que se quejó de que ya tenía un serializador registrado, pero una alternativa es escribir su propio proveedor de serialización y usarlo.

Aquí está el proveedor:

public class CustomSerializationProvider : IBsonSerializationProvider

    private static readonly DecimalSerializer DecimalSerializer = new DecimalSerializer(BsonType.Decimal128);
    private static readonly NullableSerializer NullableSerializer = new NullableSerializer(new DecimalSerializer(BsonType.Decimal128));

    public IBsonSerializer GetSerializer(Type type)
    
        if (type == typeof(decimal)) return DecimalSerializer;
        if (type == typeof(decimal?)) return NullableSerializer;

        return null; // falls back to Mongo defaults
    

que debe registrarse llamando

BsonSerializer.RegisterSerializationProvider(new CustomSerializationProvider());

valoraciones y comentarios

Si aceptas, tienes la habilidad dejar una noticia acerca de qué te ha gustado de este escrito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *