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_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); }
bson_validate 참조 자세한 내용과 예제는 설명서를 참조하세요.