Menu Docs
Página inicial do Docs
/ / /
Driver C
/ /

Analisando e iterando documentos BSON

Nesta página

  • Analisando
  • Recursão em subdocumentos
  • Encontrando campos usando notação de ponto
  • Validação de um documento BSON

Os documentos BSON são analisados displicentemente conforme necessário. Para começar a analisar um documento BSON, use uma das funções da Libbson fornecidas para criar um novo bson_t de dados existentes, como bson_new_from_data. Isso fará uma cópia dos dados para que mutações adicionais possam ocorrer no documento BSON.

Dica

Se você quiser apenas analisar um documento BSON e não precisar alterá-lo, use bson_init_static para evitar fazer uma cópia dos dados.

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);

Apenas duas verificações são realizadas ao criar um novo bson_t de um buffer existente. Primeiro, o documento deve começar com o comprimento do buffer, correspondendo ao esperado pelo chamador. Em segundo lugar, o documento deve terminar com o \0 byte final esperado.

Para analisar ainda mais o documento, usamos um bson_iter_t para iterar os elementos dentro do documento. Vamos imprimir todos os nomes de campo no documento.

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);
}

A conversão de um documento para JSON usa um bson_iter_t e bson_visitor_t para iterar todos os campos de um documento BSON recursivamente e gerar uma8 string JSON codificada em UTF- .

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 fornece subiteradores convenientes para mergulhar em um subdocumento ou subarray. Abaixo está um exemplo que mergulhará em um subdocumento chamado "foo" e imprimirá os nomes dos campos.

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));
}
}

Usando o bson_iter_recurse função ilustrada acima, bson_iter_find_descendant pode encontrar um campo para você usando a notação de caminho de estilo do MongoDB, como "foo.bar.0.baz".

Vamos criar um documento como {"foo": {"bar": [{"baz: 1}]}} e localizar o campo "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);

Se tudo que você deseja fazer é validar que um documento BSON é válido, você pode usar 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);
}

Consulte o bson_validate documentação para obter mais informações e exemplos.

Voltar

ObjectIDs

Próximo

UTF-8