BSON ドキュメントの解析と反復処理
解析
BSON ドキュメントは必要に応じて遅延解析されます。 BSON ドキュメントの解析を開始するには、提供されている libbson 関数のいずれかを使用して新しい bson_t を作成します bson_new_from_data などの既存のデータから 。これにより、データのコピーが作成され、BSON ドキュメントに追加のミューテーションが発生する可能性があります。
Tip
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 を作成するときに 2 つのチェックのみが実行されます 既存のバッファから。まず、ドキュメントはバッファ長で始まる必要があり、呼び出し元に期待されるものと一致する必要があります。 次に、ドキュメントは予想される末尾の \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 string を生成します。
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 詳細と例については、ドキュメントを参照してください。