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

解析mongosh返回内容调用BsonSerializer.Deserialize遇Long类型报错如何解决

Mongosh输出内容解析报错解决方案

问题原因

新版mongosh默认输出为Shell模式扩展JSON,会使用Long()、ObjectId()、ISODate()这类构造函数语法表示特殊类型,不属于标准BSON扩展JSON格式,因此C#的BsonSerializer无法直接识别解析。旧版mongo shell默认输出严格模式扩展JSON,所以可以直接解析。

解决方案

方案1(优先推荐):修改mongosh输出格式

在执行查询前,先在mongosh中执行以下命令设置输出为严格模式扩展JSON:

EJSON.setOutputFormat("strict")

设置后再执行查询,输出内容会自动转换为BsonSerializer可识别的格式:

  • ObjectId("xxx") 变为 {"$oid": "xxx"}
  • ISODate("xxx") 变为 {"$date": "xxx"}
  • Long("xxx") 变为 {"$numberLong": "xxx"}
    处理后的输出可以直接用BsonSerializer.Deserialize<BsonArray>(string)解析,无需额外处理,也完全兼容动态结构的场景。

方案2:预处理现有输出文本

如果无法修改mongosh的输出配置,可通过正则替换将Shell模式语法转换为严格模式,C#示例代码如下:

using System.Text.RegularExpressions;

// 原始mongosh输出文本
string rawOutput = "你的原始输出内容";

// 替换Long类型
var processedStr = Regex.Replace(rawOutput, @"Long\(""(\d+)""\)", @"{""$numberLong"":""$1""}");
// 替换ObjectId类型
processedStr = Regex.Replace(processedStr, @"ObjectId\(""([0-9a-fA-F]{24})""\)", @"{""$oid"":""$1""}");
// 替换ISODate类型
processedStr = Regex.Replace(processedStr, @"ISODate\(""([^""]+)""\)", @"{""$date"":""$1""}");

// 解析处理后的字符串
var result = BsonSerializer.Deserialize<BsonArray>(processedStr);

注意:该方案在文本内容本身包含类似构造函数字符串时可能出现误匹配,仅作为备选方案使用。


内容的提问来源于stack exchange,提问作者Витязи Team

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:48:05