c++ 如何将bson_t(旧的bson c类型)转换为bsoncxx::document?

ssm49v7z  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(127)

到目前为止,我已经考虑过使用迭代器手动获取bson_t的每个字段,类似于这样:

bsoncxx::builder::stream::document view_builder;
bson_iter_t iter;
bson_iter_init(&iter, &bson_t_doc);

while (bson_iter_next(&iter)) {
    const char* key = bson_iter_key(&iter);
    bson_type_t type = bson_iter_type(&iter);

    switch (type) {
        case BSON_TYPE_UTF8:
            view_builder << key << bsoncxx::types::b_utf8{bson_iter_utf8(&iter, nullptr)};
            break;
        case BSON_TYPE_INT32:
            view_builder << key << bsoncxx::types::b_int32{bson_iter_int32(&iter)};
            break;
        case BSON_TYPE_INT64:
            view_builder << key << bsoncxx::types::b_int64{bson_iter_int64(&iter)};
            break;
        default:
            break;
    }
}

字符串
然而,这种方法需要一个相当大的、丑陋的开关,包含所有支持的类型(对于我的使用,我只能隔离旧的bson_t文档中使用的类型...)
我一直试图找到一个实际的函数,但似乎没有一个。作为一个注意,bson_t类型似乎并没有暴露二进制缓冲区,所以似乎我不能快速访问二进制数据。
有人做过类似的事情吗?

euoag5mw

euoag5mw1#

“* 如果我包含libbson,我可以简单地使用bson_get_data()*...”为什么不这样做?
bson_get_data()函数应该返回bson文档的raw buffer。如果你想复制raw buffer,这可以和bson_tlen属性一起使用。
bson_t::bson_get_data()
使用原始的二进制数据和长度,示例化一个bsoncxx::document::view
这比使用bsoncxx::builder::stream::document将二进制数据(大小可能为16mb)从bson_t示例复制到bsoncxx::document::view更有效,就像您在示例中所做的那样。

相关问题