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

如何将MongoDB BsonDocument集合序列化为以_id为键的键值对JSON

实现步骤

核心逻辑是先将数组结构转换为以_id为键、剩余字段为值的字典结构,再做序列化即可,两种常用实现方式如下:

方式1:仅用MongoDB官方驱动实现(无需额外依赖)

直接通过BsonDocument构造目标结构,再调用自带的ToJson()方法:

// 假设sourceDocs是你查询得到的BsonDocument数组/IEnumerable<BsonDocument>
BsonDocument result = new BsonDocument();

foreach (BsonDocument doc in sourceDocs)
{
    // 提取_id值作为顶级键,若_id为ObjectId类型可按需调用ToString()转为字符串格式
    BsonValue id = doc["_id"];
    // 克隆当前文档并删除_id字段
    BsonDocument valueDoc = doc.DeepClone().AsBsonDocument;
    valueDoc.Remove("_id");
    // 添加到结果文档
    result.Add(id.ToString(), valueDoc);
}

// 直接序列化得到目标格式JSON
// 可传入JsonWriterSettings自定义缩进、格式规则
string targetJson = result.ToJson(new JsonWriterSettings { Indent = true });

方式2:结合通用JSON序列化库实现(适配Newtonsoft.Json/System.Text.Json)

先转换为泛型字典结构,再用常用序列化库处理:

// 以Newtonsoft.Json为例
using Newtonsoft.Json;

// 转换为Dictionary结构
Dictionary<string, object> resultDict = sourceDocs.ToDictionary(
    doc => doc["_id"].ToString(),
    doc => 
    {
        BsonDocument tmp = doc.DeepClone().AsBsonDocument;
        tmp.Remove("_id");
        // 将BsonDocument转为普通字典供序列化库识别
        return tmp.ToDictionary();
    }
);

// 序列化输出
string targetJson = JsonConvert.SerializeObject(resultDict, Formatting.Indented);

注意事项

  • 若_id为MongoDB默认的ObjectId类型,未做转换直接序列化会得到{"$oid": "xxx"}的格式,提前调用ToString()可得到24位纯字符串ID
  • 需要保留BSON特殊类型(如ISODate、Decimal128)的序列化标识时,优先使用MongoDB驱动自带的ToJson()方法,类型兼容性更好
  • 可通过JsonWriterSettings(驱动自带)或序列化库的配置参数自定义空值处理、日期格式、缩进规则等

内容的提问来源于stack exchange,提问作者Jordi Espada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:15:08