문서 메뉴
문서 홈
/ / /
C 드라이버
/ /

BSON 문서 구문 분석 및 반복

이 페이지의 내용

  • 구문 분석
  • 하위 문서로 재귀
  • 점 표기법을 사용하여 필드 찾기
  • 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

다음

UTF-8