Overview
このガイドでは、BSONドキュメントの作成方法、BSONドキュメントのファイルへの書き込み方法、Cドライバーを使用してファイルからBSONデータを読み取る方法を学ぶことができます。
BSON, or Binary JSON, is the data format that MongoDB uses to organize and store data. このデータ形式には、すべての JSON データ構造タイプが含まれ、日付、異なるサイズの整数、ObjectId、バイナリ データなどのタイプのサポートが追加されています。 サポートされているタイプの完全なリストについては、 BSON typesサーバーのマニュアル ページを参照してください。
libbsonパッケージを含めることで、CアプリケーションでBSONドキュメントを使用できます。
このガイドのコード サンプルでは、次の BSON ドキュメントを例として使用します。
{ "address" : { "street" : "Pizza St", "zipcode" : "10003" }, "coord" : [-73.982419, 41.579505] "cuisine" : "Pizza", "name" : "Mongo's Pizza" }
BSON ドキュメントの作成
BSONドキュメントは、Cドライバーでは bson_t 型によって表されます。BCON_NEW() 関数を使用して bson_tインスタンスを作成できます。次の例では、サンプルBSONドキュメントの bson_t 表現を作成します。
bson_t *doc = BCON_NEW( "address", "{", "street", BCON_UTF8("Pizza St"), "zipcode", BCON_UTF8("10003"), "}", "coord", "[", BCON_DOUBLE(-73.982419), BCON_DOUBLE(41.579505), "]", "cuisine", BCON_UTF8("Pizza"), "name", BCON_UTF8("Mongo's Pizza") );
注意
BSONフィールド値
BSONドキュメントにフィールドを作成または追加する場合は、適切な BCON_* 関数を使用してフィールド値を正しく表現していることを確認してください。BCON_* 関数の完全なリストについては、Cドライバー GitHubリポジトリの bson-bcon.hファイル を参照してください。
BSONドキュメントへの追加
BCON_APPEND() 関数を使用して、既存の bson_tインスタンスにフィールドと値のペアを追加できます。次の例では、サンプルBSONドキュメントに新しい yearEstablishedフィールドと値を追加します。
BCON_APPEND(doc, "yearEstablished", BCON_INT32(1996));
追加する値のデータ型に対応する bson_append_* 関数を使用することもできます。次の例では、 bson_append_int32() 関数を使用して、前の例と同じフィールドと値のペアを追加します。
bson_append_int32(doc, "yearEstablished", -1, 1996);
bson_append_* 関数の完全なリストについては、libbson APIドキュメントの bson_t を参照してください。
BSON をファイルに書き込む
標準のCファイルI/O ライブラリで bson_get_data() 関数を使用して、BSONデータをファイルに書き込みことができます。次の例では、サンプルBSONドキュメントをoutput.bson という名前のファイルに書き込みます。
FILE *fp; if ((fp = fopen("output.bson", "wb"))) { fwrite(bson_get_data(doc), 1, doc->len, fp); fclose(fp); } else { fprintf(stderr, "Failed to open file for writing.\n"); return EXIT_FAILURE; }
ファイルからの BSON を読み込む
bson_reader_t タイプを使用して、ファイル、メモリ リージョン、またはカスタムコールバックからBSONドキュメントのシーケンスを読み取ることができます。次の例では、example.bson という名前のファイルからBSONドキュメントを読み取り、各ドキュメントのJSON表現を出力します。
bson_reader_t *reader; bson_error_t error; const bson_t *b; char *str; if (!((reader = bson_reader_new_from_file("example.json", &error)))) { fprintf(stderr, "Failed to open file: %s\n", error.message); return EXIT_FAILURE; } while ((b = bson_reader_read(reader, NULL))) { str = bson_as_canonical_extended_json(b, NULL); fprintf(stdout, "%s\n", str); bson_free(str); } bson_reader_destroy(reader);
ファイルからJSONを読み込む
bson_json_reader_t タイプを使用してJSONドキュメントのシーケンスを読み取り、bson_t ドキュメントに変換できます。次の例では、example.json という名前のファイルからJSONドキュメントを読み取り、各ドキュメントをBSON形式に変換してドキュメントを出力します。
bson_json_reader_t *reader; int b; bson_error_t error; bson_t doc = BSON_INITIALIZER; if (!((reader = bson_json_reader_new_from_file("example.json", &error)))) { fprintf(stderr, "Failed to open file: %s\n", error.message); return EXIT_FAILURE; } while ((b = bson_json_reader_read(reader, &doc, &error))) { if (b < 0) { fprintf(stderr, "Failed to parse JSON: %s\n", error.message); abort(); } if (fwrite(bson_get_data(&doc), 1, doc.len, stdout) != doc.len) { fprintf(stderr, "Failed to write BSON to stdout, exiting.\n"); exit(1); } bson_reinit(&doc); } bson_json_reader_destroy(reader); bson_destroy(&doc);
クリーンアップ
次の例に示すように、bson_destroy() 関数を使用して、BSONドキュメントに割り当てられたメモリを解放できます。
bson_t *doc = BCON_NEW("test", BCON_UTF8("example")); // Operations using doc bson_destroy(doc);
重要
アプリケーションでのメモリリークを避けるために、終了したら必ず bson_tインスタンスで bson_destroy() を呼び出してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。