到目前为止,我已经考虑过使用迭代器来手动获取 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 类型似乎根本没有公开二进制缓冲区,因此我似乎无法快速访问二进制数据。
有人做过类似的事吗?
“如果我要包含
libbson
,我可以简单地使用bson_get_data()
...”为什么不这样做呢?
函数应返回bson文档的原始缓冲区。如果您想复制原始缓冲区,可以将其与bson_get_data()
的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
更有效,就像您在示例中所做的那样。