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

Ram*_*ein 16 c# mongodb

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

Ram*_*ein 29

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

Pre v3.4将 小数存储为字符串,但这会阻止算术运算.运营商as $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)));
Run Code Online (Sandbox Code Playgroud)

  • 你把 BsonSerializer.RegisterSerializer 代码放在项目的什么地方? (3认同)
  • @stoneMaster 我经常为我的 Mongo 上下文使用静态构造函数。如果您只有一个 Mongo 上下文类,这可以正常工作。另一种选择是不提供默认注册,而是在流畅的配置中指定序列化器:`r.MapProperty(_ =&gt; _.Value) .SetElementName("value") .SetIsRequired(true) .SetSerializer(new DecimalSerializer( BsonType.Decimal128))`。 (3认同)

Eri*_*ing 8

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

[BsonRepresentation(BsonType.Decimal128)]
public decimal Price {get; set;}
Run Code Online (Sandbox Code Playgroud)