到目前为止,我已经考虑过使用迭代器手动获取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类型似乎并没有暴露二进制缓冲区,所以似乎我不能快速访问二进制数据。
有人做过类似的事情吗?
1条答案
按热度按时间euoag5mw1#
“* 如果我包含
libbson
,我可以简单地使用bson_get_data()
*...”为什么不这样做?bson_get_data()
函数应该返回bson文档的raw buffer。如果你想复制raw buffer,这可以和bson_t
的len
属性一起使用。bson_t::bson_get_data()
个使用原始的二进制数据和长度,示例化一个
bsoncxx::document::view
。这比使用
bsoncxx::builder::stream::document
将二进制数据(大小可能为16mb)从bson_t
示例复制到bsoncxx::document::view
更有效,就像您在示例中所做的那样。