C#使用BsonDocument.Parse解析MongoDB查询报System.FormatException如何解决
错误原因分析
你遇到的System.FormatException报错,核心原因是BsonDocument.Parse()方法仅支持解析单个符合格式的BSON文档字符串:
- 你传入的
"{'Username':'Test'},{ 'Age':'25'}"是两个独立的BSON文档用逗号拼接的结果,不属于单个合法BSON结构,因此解析器读到第一个文档结尾后发现还有剩余字符就抛出异常。 - 你给出的第二种
$group片段本身也不是完整的独立BSON文档,缺少外层大括号包裹,同样无法直接用BsonDocument.Parse()解析。
不同场景的正确解析方案
场景1:解析多个逗号分隔的BSON文档(比如查询条件+投影参数的组合)
如果你传入的字符串是MongoDB查询方法里的filter和projection两个参数的拼接内容,需要先拆分两个文档分别解析:
// 示例为简单拆分,复杂嵌套场景建议用官方批量解析方法 var rawStr = "{'Username':'Test'},{ 'Age':'25'}"; // 定位第一个文档闭合后的分割逗号 var splitIndex = rawStr.IndexOf("},") + 1; var filterStr = rawStr.Substring(0, splitIndex).Trim(); var projectionStr = rawStr.Substring(splitIndex + 1).Trim(); // 分别解析为BsonDocument var filter = BsonDocument.Parse(filterStr); var projection = BsonDocument.Parse(projectionStr); // 调用查询的示例 var result = collection.Find(filter).Project(projection).ToList();
如果需要批量解析任意数量的BSON文档,用官方提供的序列化器更稳妥:
using var reader = new JsonReader("{'Username':'Test'},{ 'Age':'25'}"); var serializer = BsonSerializer.LookupSerializer<BsonDocument>(); var docs = new List<BsonDocument>(); while (reader.ReadBsonType() != BsonType.EndOfDocument) { docs.Add(serializer.Deserialize(BsonDeserializationContext.CreateRoot(reader))); }
场景2:解析聚合阶段片段
聚合操作的单个阶段本身是完整BSON文档,你给出的$group片段补全外层大括号后即可正常解析:
// 补全外层大括号,形成合法BSON结构 var groupStageStr = @"{'$group' : {""_id"" : {""Username"" : ""$Test""}}}"; var groupStage = BsonDocument.Parse(groupStageStr); // 加入聚合管道的示例 var pipeline = PipelineDefinition<BsonDocument, BsonDocument>.Create(groupStage); var aggResult = collection.Aggregate(pipeline).ToList();
如果是完整的聚合管道数组,直接解析为BsonArray即可:
var pipelineStr = @"[{'$match':{'Username':'Test'}},{'$group' : {""_id"" : {""Username"" : ""$Test""}}}]"; var pipeline = BsonSerializer.Deserialize<BsonArray>(pipelineStr).Select(x => x.AsBsonDocument).ToList();
注意事项
BSON的JSON格式默认要求键值对用双引号包裹,MongoDB C#驱动虽然兼容单引号解析,但建议统一使用双引号避免不必要的格式异常。
内容的提问来源于stack exchange,提问作者Ammar Al-Sadeq
相关产品推荐
相关产品推荐

