구문 분석
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_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 가 "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 문서 유효한지 검증하기만 하는 경우, 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); }