Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/ / /
C 驱动程序
/ /

解析和迭代 BSON 文档

BSON文档会根据需要进行延迟解析。要开始解析BSON文档,请使用提供的 Libbson 函数之一从现有数据(例如 bson_new_from_data)创建新的 bson_t。这将复制数据,以便BSON文档发生其他更改。

提示

如果只想解析BSON文档而无需对其进行更改,则可以使用 bson_init_static 来避免复制数据。

bson_t *b;
b = bson_new_from_data (my_data, my_data_len);
if (!b) {
fprintf (stderr, "The specified length embedded in <my_data> did not match "
"<my_data_len>\n");
return;
}
bson_destroy (b);

从现有缓冲区创建新的 bson_t 时,仅执行两项检查。首先,文档必须以缓冲区长度开始,与调用者的预期相匹配。其次,文档必须以预期的结尾\0 字节结束。

为了进一步解析文档,我们使用 bson_iter_t 来迭代文档中的元素。让我们打印文档中的所有字段名称。

bson_t *b;
bson_iter_t iter;
if ((b = bson_new_from_data (my_data, my_data_len))) {
if (bson_iter_init (&iter, b)) {
while (bson_iter_next (&iter)) {
printf ("Found element key: \"%s\"\n", bson_iter_key (&iter));
}
}
bson_destroy (b);
}

将文档转换为JSON时会使用 bson_iter_t bson_visitor_t 递归遍历BSON文档的所有字段,并生成 UTF-8 编码的JSON字符串。

bson_t *b;
char *json;
if ((b = bson_new_from_data (my_data, my_data_len))) {
if ((json = bson_as_canonical_extended_json (b, NULL))) {
printf ("%s\n", json);
bson_free (json);
}
bson_destroy (b);
}

Libbson 提供了方便的子迭代器来深入研究子文档或子数组。 下面的示例将深入到名为“foo”的子文档并打印其字段名称。

bson_iter_t iter;
bson_iter_t child;
char *json;
if (bson_iter_init_find (&iter, doc, "foo") &&
BSON_ITER_HOLDS_DOCUMENT (&iter) && bson_iter_recurse (&iter, &child)) {
while (bson_iter_next (&child)) {
printf ("Found sub-key of \"foo\" named \"%s\"\n",
bson_iter_key (&child));
}
}

使用上面举例说明的 bson_iter_recurse 函数,bson_iter_find_descendant 可以使用MongoDB样式路径符号(例如“foo.bar..baz”)为您查找字段。0

让我们创建一个类似{"foo": {"bar": [{"baz: 1}]}}的文档并找到"baz"字段。

bson_t *b;
bson_iter_t iter;
bson_iter_t baz;
b =
BCON_NEW ("foo", "{", "bar", "[", "{", "baz", BCON_INT32 (1), "}", "]", "}");
if (bson_iter_init (&iter, b) &&
bson_iter_find_descendant (&iter, "foo.bar.0.baz", &baz) &&
BSON_ITER_HOLDS_INT32 (&baz)) {
printf ("baz = %d\n", bson_iter_int32 (&baz));
}
bson_destroy (b);

如果您只想验证BSON文档是否有效,则可以使用 bson_validate。

size_t err_offset;
if (!bson_validate (doc, BSON_VALIDATE_NONE, &err_offset)) {
fprintf (stderr,
"The document failed to validate at offset: %u\n",
(unsigned) err_offset);
}

有关更多信息和示例,请参阅 bson_validate 文档。

后退

ObjectID

在此页面上