Analisando e iterando documentos BSON
Nesta página
Analisando
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 byte \0
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); }
Recursão em subdocumentos
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)); } }
Encontrando campos usando notação de ponto
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);
Validação de um documento BSON
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.