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

问题描述 投票:0回答:1

到目前为止,我已经考虑过使用迭代器来手动获取 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 类型似乎根本没有公开二进制缓冲区,因此我似乎无法快速访问二进制数据。

有人做过类似的事吗?

c++ bson mongo-cxx-driver
1个回答
0
投票

如果我要包含

libbson
,我可以简单地使用
bson_get_data()
...”为什么不这样做呢?

bson_get_data()
函数应返回bson文档的原始缓冲区。如果您想复制原始缓冲区,可以将其与
len
bson_t
属性结合使用。

bson_t::bson_get_data()

使用原始二进制数据 (

bson_t.bson_get_data()
) 和长度 (
bson_t.len
),使用它们实例化
bsoncxx::document::view


这比使用
bson_t
将二进制数据(大小可能为 16mb)从
bsoncxx::document::view
实例复制到
bsoncxx::builder::stream::document
更有效,就像您在示例中所做的那样。

© www.soinside.com 2019 - 2024. All rights reserved.