Docs Menu
Docs Home
/ /

Parsear e iterar documentos BSON

Los documentos BSON se analizan de forma diferida según sea necesario. Para comenzar a analizar un documento BSON, utilice una de las funciones de Libbson proporcionadas para crear un nuevo documento. bson_t a partir de datos existentes, como bson_new_from_data. Esto creará una copia de los datos para que se puedan realizar modificaciones adicionales en el documento BSON.

Tip

Si solo desea analizar un documento BSON y no necesita mutarlo, puede usar bson_init_static para evitar hacer una copia de los datos.

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

Solo se realizan dos comprobaciones al crear un nuevo bson_t a partir de un búfer existente. Primero, el documento debe comenzar con la longitud del búfer, que coincide con lo esperado por el invocador. Segundo, el documento debe terminar con la longitud final esperada. \0 byte.

Para analizar el documento con más detalle, usamos bson_iter_t para iterar los elementos dentro del documento. Imprimimos todos los nombres de campo del 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);
}

La conversión de un documento a JSON utiliza bson_iter_t y bson_visitor_t para iterar todos los campos de un documento BSON de forma recursiva y generar una8 cadena JSON codificada en 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 proporciona subiteradores prácticos para explorar un subdocumento o una submatriz. A continuación, se muestra un ejemplo que explora un subdocumento llamado "foo" e imprime sus nombres de campo.

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 la función bson_iter_recurse ejemplificada anteriormente, bson_iter_find_descendant puede encontrar un campo para usted usando la notación de ruta de estilo MongoDB como "foo.bar..baz".0

Creemos un documento como {"foo": {"bar": [{"baz: 1}]}} y localicemos el 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);

Si todo lo que desea hacer es validar que un documento BSON sea válido, puede utilizar 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 la documentación de bson_validate para obtener más información y ejemplos.

Volver

ObjectIDs

En esta página