2017-04-18 21 views

回答

8

直到MongoDB v3.4,MongoDB才正確支持小數。在這個版本之前,它將小數存儲爲字符串以避免精度錯誤。

預先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))); 
+0

大註冊,你救我的天! – vNext

0

我不得不使用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());