You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:07:17