MongoDB的TruncationException异常解决方法

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

近期由于DB4O的一些无解的BUG,导致现行的项目查询效率底下,于是愤而迁移到了MongoDB。

MongoDB虽然比DB4O的用户要多一些,但是文档依然极度匮乏,遇到问题不是那么容易就能搜到解决办法,在此分享一个遇到的比较要命的异常问题的修正办法。

 

异常情况描述

我的项目使用的是C#版官方驱动,运转一直良好,今天在访问期间突然就出现了这样的异常,并且无论怎么刷新都无法恢复:

MongoDB.Bson.TruncationException: Truncation resulted in data loss.

[TruncationException: Truncation resulted in data loss.] 
   MongoDB.Bson.Serialization.Options.RepresentationSerializationOptions.ToSingle(Double value) +339 
   MongoDB.Bson.Serialization.Serializers.SingleSerializer.Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options) +257 
   MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeMemberValue(BsonReader bsonReader, BsonMemberMap memberMap) +342

[FileFormatException: An error occurred while deserializing the Money property of class MongoModels.User: Truncation resulted in data loss.] 
   MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeMemberValue(BsonReader bsonReader, BsonMemberMap memberMap) +878 
   MongoDB.Bson.Serialization.BsonClassMapSerializer.Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options) +1343 
   MongoDB.Bson.Serialization.BsonClassMapSerializer.Deserialize(BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options) +247

任何读取到用户数据的页面都会报这个错误,完全无法正常使用网站了。

 

分析与解决

注意错误提示中我标注的红色内容位置,问题就可以定位到User类的Money属性上:

public float Money
        {
            get;
            set;
        }

这属性很简单,就是个float类型的数字而已,怎么会出错呢?

用MongoVUE查看数据库的User集合,完全正常,只是这个Money值由于是浮点数,会有一定的误差,导致小数位数非常长。

直接搜索"Truncation resulted in data loss"无果,辗转找到了一个类似的问题解答:

http://stackoverflow.com/questions/5314238/how-do-i-set-the-serialization-options-for-the-geo-values-using-the-official-10g

按照解答者提供的方法进行尝试:

[BsonRepresentation(BsonType.Double, AllowTruncation = true)]
        public float Money
        {
            get;
            set;
        }

果然一切正常了,看来主要是要显式声明允许驱动程序截断浮点类型的多余位数。

 

总结

这真是纯坑爹的设计,初期不强制声明,运行期间需要截断时才报错,定时炸弹一样凶残。

看来像decimal、float、double这种浮点型数据都应该显式进行此声明,否则就会留下严重隐患。


本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/p/3960057.html,如需转载请自行联系原作者


相关文章
|
存储 NoSQL 测试技术
在MongoDB建模1对N关系的基本方法
了解更多阿里云MongoDB的介绍
1815 2
在MongoDB建模1对N关系的基本方法
|
NoSQL MongoDB
MongoDB因服务器异常断电,无法启动异常的修复
本文是博主遇到MongoDB启动异常的解决方法记录,希望对大家有所帮助。
1807 0
|
NoSQL 关系型数据库 MySQL
深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析
在 MongoDB 中,我们使用 find() 和 find_one() 方法来在集合中查找数据,就像在MySQL数据库中使用 SELECT 语句来在表中查找数据一样
297 1
|
NoSQL MongoDB 数据库
MongoDB 分页神器:limit() 和 skip() 方法详解
MongoDB 分页神器:limit() 和 skip() 方法详解
310 1
|
NoSQL Java MongoDB
MongoDB Limit 与 Skip 方法
10月更文挑战第16天
175 3
|
NoSQL Ubuntu MongoDB
在Ubuntu 16.04上安装和保护MongoDB的方法
在Ubuntu 16.04上安装和保护MongoDB的方法
208 1
|
NoSQL 安全 MongoDB
精准数据清理:掌握 MongoDB 删除集合的方法与最佳实践
精准数据清理:掌握 MongoDB 删除集合的方法与最佳实践
696 0
|
SQL NoSQL Shell
MongoDB常用的操作-(find方法)
MongoDB常用的操作-(find方法)
422 0
|
NoSQL MongoDB 数据库
4种方法解决MongoDB游标超时的问题
4种方法解决MongoDB游标超时的问题
842 0

推荐镜像

更多