如何使用标准C#驱动程序在MongoDB中存储小数?似乎所有小数都作为字符串存储在数据库中。
答案 0 :(得分:24)
MongoDB在MongoDB v3.4之前不能正确支持小数。在此版本之前,它将小数作为字符串存储,以避免精度错误。
Pre v3.4
将小数存储为字符串,但这会阻止算术运算。 $min
,$avg
,...的运营商无法使用。如果精确度不是很大,那么您可以切换到double
。
<强> V3.4 + 强> 您需要确保以下前提条件成立:
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;}