解析
BSONドキュメントは必要に応じて遅延解析されます。 BSONドキュメント の解析を開始するには、提供されている libbson 関数のいずれかを使用して、 bson_new_from_data などの既存のデータから新しい bson_t を作成します。これにより、データのコピーが作成され、 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 8を使用して、 BSONドキュメントのすべてのフィールドを再帰的に反復処理し、UTF- でエンコードされた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_recurs 関数を使用すると、bson_iter_find_descendant は "foo.bar..baz" などのMongoDB形式のパス表記を使用しているフィールドを見つけることができます。0
{"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 ドキュメントを参照してください。