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

如何将旧版BSON C类型bson_t转换为bsoncxx::document?

从bson_t转换为bsoncxx文档的简洁实现方案

你提到的手动遍历bson_t字段构造document的方式可行,但需要处理全量BSON类型,代码会显得冗长。其实bsoncxx库本身提供了更简洁的转换方式,无需手动编写switch分支:

直接构造文档视图

可以直接用bsoncxx::document::view从C风格的bson_t构造,这是轻量级的视图,不会复制原始数据:

// 假设已存在bson_t类型变量bson_t_doc
bsoncxx::document::view doc_view{&bson_t_doc};

如果需要构建一个可独立持久化的文档对象,可基于视图构造document::value:

bsoncxx::document::value doc_value = bsoncxx::document::value{doc_view};

访问bson_t的二进制缓冲区

bson_t可以通过官方提供的C API函数获取内部二进制数据:

const uint8_t* buffer = bson_data(&bson_t_doc);
size_t buffer_size = bson_get_data_size(&bson_t_doc);

通过这两个函数就能直接拿到原始BSON二进制数据的指针和长度。

需手动处理字段时的简化写法

如果你的场景必须过滤字段或自定义类型处理,也可以用bsoncxx的迭代器替代C风格bson_iter_t,省去手动判断类型的代码:

bsoncxx::document::view doc_view{&bson_t_doc};
bsoncxx::builder::stream::document view_builder;

for (auto&& element : doc_view) {
    view_builder << element.key() << element.get_value();
}

auto new_doc = view_builder << bsoncxx::builder::stream::finalize;

element.get_value()会自动适配所有支持的BSON类型,无需再写switch分支。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:10:12