C#获取MongoDB dbStats的dataSize时类型转换异常求助
解决MongoDB dbstats返回dataSize类型转换错误的问题
这个坑我之前踩过!当你清空MongoDB所有记录后,dbstats命令返回的dataSize会从BsonDouble变成BsonInt32(毕竟数值太小,用32位整数就够了),这直接导致你用AsDouble强转时抛出类型转换异常。
给你几个靠谱的解决办法:
方法1:使用BsonValue的通用转换方法
BsonValue自带ToDouble()方法,不管底层是Int32还是Double,都能安全转换成double类型,代码最简洁:
var command = new BsonDocumentCommand<BsonDocument>(new BsonDocument { { "dbstats", 1} }); var dbstats = ResultDatabase.RunCommand(command); var TotalRecordSize = dbstats["dataSize"].ToDouble();
方法2:显式判断类型处理(更严谨)
如果需要区分不同类型做特殊处理,可以先判断值的类型再转换,避免意外:
var command = new BsonDocumentCommand<BsonDocument>(new BsonDocument { { "dbstats", 1} }); var dbstats = ResultDatabase.RunCommand(command); BsonValue dataSizeVal = dbstats["dataSize"]; double TotalRecordSize; if (dataSizeVal is BsonInt32 intVal) { TotalRecordSize = intVal.Value; } else if (dataSizeVal is BsonDouble doubleVal) { TotalRecordSize = doubleVal.Value; } else { // 兜底处理其他可能的类型,比如BsonInt64 TotalRecordSize = dataSizeVal.ToDouble(); }
方法3:先转成整数类型再转double
因为dataSize本质是字节数,是整数类型,你也可以先转成long(覆盖更大的数值范围),再转成double:
var command = new BsonDocumentCommand<BsonDocument>(new BsonDocument { { "dbstats", 1} }); var dbstats = ResultDatabase.RunCommand(command); var TotalRecordSize = (double)dbstats["dataSize"].AsInt64;
本质原因是MongoDB会根据dataSize的实际数值大小自动选择返回的Bson类型,小数值用Int32,大数值用Double(或Int64),所以不能直接假设固定类型,用通用转换方法才是稳妥的做法。
内容的提问来源于stack exchange,提问作者trashrobber
相关产品推荐
相关产品推荐

