Docs Menu
Docs Home
/ /

BSON 문서 구문 분석 및 반복

BSON 문서는 필요에 따라 느리게 구문 분석됩니다. BSON 문서 구문 분석을 시작하려면 제공된 Libbson 함수 중 하나를 사용하여 기존 데이터에서 새 bson_t 를 만듭니다(예: bson_new_from_data). 이렇게 하면 데이터 복사본이 만들어지므로 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_tbson_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 가 "foo.bar.0.baz"와 같은 MongoDB 스타일 경로 표기법을 사용하여 필드 찾을 수 있습니다.

{"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

이 페이지의 내용