如何在MongoDB中使用十进制类型

时间:2017-04-18 13:09:29

标签: c# mongodb

如何使用标准C#驱动程序在MongoDB中存储小数?似乎所有小数都作为字符串存储在数据库中。

4 个答案:

答案 0 :(得分:24)

MongoDB在MongoDB v3.4之前不能正确支持小数。在此版本之前,它将小数作为字符串存储,以避免精度错误。

Pre v3.4 将小数存储为字符串,但这会阻止算术运算。 $min$avg,...的运营商无法使用。如果精确度不是很大,那么您可以切换到double

<强> V3.4 + 您需要确保以下前提条件成立:

  • MongoDB服务器至少应为v3.4。
  • MongoCSharpDriver应至少为v2.4.3。
  • 数据库应将featureCompatibilityVersion设置为'3.4'。如果您的数据库是由较旧的MongoDB版本创建的,并且您已将服务器升级到v3.4,那么您的数据库可能仍处于旧版本。

如果设置了所有属性,请注册以下序列化程序以使用decimal128类型:

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

答案 1 :(得分:2)

我遇到了使用RegisterSerializer方法的问题,因为它抱怨它已经注册了一个序列化程序,但另一种方法是编写自己的序列化提供程序并使用它。

这是提供者:

public class CustomSerializationProvider : IBsonSerializationProvider
{
    private static readonly DecimalSerializer DecimalSerializer = new DecimalSerializer(BsonType.Decimal128);
    private static readonly NullableSerializer<decimal> NullableSerializer = new NullableSerializer<decimal>(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
    }
}

您需要通过致电

进行注册
BsonSerializer.RegisterSerializationProvider(new CustomSerializationProvider());

答案 2 :(得分:2)

我像Erik Kindling那样解决了这个问题,方法是对这样的对象进行注释:

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

但是,重要的是您重新填充mongodb集合,否则字符串值将被保留。 正确插入后,该字段值将采用这种格式:

"Price" : NumberDecimal("99")

答案 3 :(得分:0)

我最近遇到了这个问题。我通过简单地注释我的对象来解决了这个问题:

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