MongoDB的TruncationException异常解决方法

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

近期由于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,如需转载请自行联系原作者


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
3月前
|
NoSQL 关系型数据库 MySQL
深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析
在 MongoDB 中,我们使用 find() 和 find_one() 方法来在集合中查找数据,就像在MySQL数据库中使用 SELECT 语句来在表中查找数据一样
65 1
|
NoSQL MongoDB
MongoDB因服务器异常断电,无法启动异常的修复
本文是博主遇到MongoDB启动异常的解决方法记录,希望对大家有所帮助。
1196 0
|
8月前
|
SQL NoSQL Shell
MongoDB常用的操作-(find方法)
MongoDB常用的操作-(find方法)
139 0
|
NoSQL Java MongoDB
MongoDB Limit与Skip方法
MongoDB Limit与Skip方法
55 0
|
存储 NoSQL JavaScript
使用TS封装操作MongoDB数据库的工具方法
使用TS封装操作MongoDB数据库的工具方法
|
NoSQL MongoDB
MongoDB实现Multi tenant的方法
MongoDB实现Multi tenant的方法
228 0
MongoDB实现Multi tenant的方法
|
存储 缓存 运维
MongoDB的WiredTigerLAS.wt大小异常分析
# MongoDB的WiredTigerLAS.wt大小异常分析 ## 背景 最近在运维MongoDB时遇到一个磁盘空间增长异常的问题,主要是WiredTigerLAS.wt这个文件占用了70GB以上的空间。经排查,有不少用户都遇到过这个问题,其背后的根本原因和MongoDB的一个bug有关。本篇文章会详细分析这个问题背后的原因以及涉及到的相关技术原理,并给出解决方法。 ## Wir
607 0
MongoDB的WiredTigerLAS.wt大小异常分析
|
监控 NoSQL 数据库
mongodb监控常用方法
列举mongodb监控的常用命令 1.监控统计 mongostat 可用于查看当前QPS/内存使用/连接数,以及多个shard的压力分布 命令参考 ./mongostat --port 27071 -u admin -p xxx --authenticationDatabase=admin --d...
1653 0
|
NoSQL 数据库 MongoDB