You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:05:30