如何通过C API从bson_iter_t获取bson_t*子文档
问题:如何从BSON子文档对应的bson_value_t中获取bson_t*指针?
我正在使用mongoc及关联的BSON库进行磁盘文件读写操作,用于验收测试场景——通过bson_writer_*函数生成的二进制文件保存预期结果,文件的二进制转ASCII内容显示正常。
我用bson_reader_*读取文件的代码如下(已省略错误检查):
bool foundEOF; bson_error_t error; const char* file_name = "expected_results.dat"; bson_reader_t *reader = bson_reader_new_from_file (file_name, &error); const bson_t *doc = bson_reader_read (reader, &foundEOF);
读取主文档没问题,但在查找特定条目并提取子文档时遇到了问题:
bson_iter_t iter; bson_iter_init_find(&iter, doc, "my_key"); const bson_value_t *value = bson_iter_value (&iter);
已知my_key对应一个BSON子文档,但我只有bson_value_t*,不知道怎么获取对应的bson_t*指针来做后续操作。原本以为可以像mongo_cursor_t那样直接获取子文档:
const bson_t* subdoc = nullptr; mongo_cursor_next(cursor, subdoc);
但没找到BSON API里对应的方法,请问该怎么处理?
解决方法
你不需要通过bson_iter_value来获取子文档,BSON迭代器专门提供了bson_iter_document函数,直接从迭代器中提取子文档的bson_t*指针。
修改后的代码示例:
bson_iter_t iter; if (bson_iter_init_find(&iter, doc, "my_key")) { const bson_t *subdoc; uint32_t subdoc_len; // 从迭代器中提取子文档 bson_iter_document(&iter, &subdoc_len, &subdoc); // 现在可以用subdoc做后续操作,比如遍历子文档的字段 bson_iter_t sub_iter; if (bson_iter_init(&sub_iter, subdoc)) { while (bson_iter_next(&sub_iter)) { // 处理子文档中的每个字段 printf("子文档字段:%s\n", bson_iter_key(&sub_iter)); } } }
关键说明
bson_iter_document会直接返回指向原文档中内嵌子文档的const bson_t*指针,不需要额外复制数据,效率很高。- 第二个参数
subdoc_len会返回子文档的字节长度,如果不需要可以传入NULL。 - 注意:这个
subdoc的生命周期和原doc绑定,原文档被销毁后,子文档指针也会失效。
内容的提问来源于stack exchange,提问作者Cosmo
相关产品推荐
相关产品推荐

