このガイドでは、MongoDB C ドライバーについて簡単に紹介します。
For more information on the C API, please refer to the api.
のインストール
MongoDB C ドライバーを特定のプラットフォームにインストールする方法の詳細については、 インストール ガイドをご覧ください。
MongoDB の起動
このチュートリアルの例を実行するには、MongoDB がデフォルト ポートの27017 localhost
にインストールされ、実行されている必要があります。 起動して実行中であるかどうかを確認するには、MongoDB shell を使用して に接続します。
$ mongosh --host localhost --port 27017 --quiet Enterprise rs0 [direct: primary] test> db.version() 7.0.0 >
C プログラムに libmongoc を含めてリンクする
mongoc.h を含める
すべての libmongoc の関数と型は 1 つのヘッダーファイルで利用できます。 単純にmongoc/mongoc.h
を含めます。
CMax
The libmongoc installation includes a CMake config-file package, so you can use CMake's find_package command to import libmongoc's CMake target and link to libmongoc (as a shared library):
# Specify the minimum version you require. find_package (mongoc-1.0 1.7 REQUIRED) # The "hello_mongoc.c" sample program is shared among four tests. add_executable (hello_mongoc ../../hello_mongoc.c) target_link_libraries (hello_mongoc PRIVATE mongo::mongoc_shared)
代わりに、libmongoc を静的ライブラリとして使用することもできますmongo::mongoc_static
CSpec ターゲットを使用します。
# Specify the minimum version you require. find_package (mongoc-1.0 1.7 REQUIRED) # The "hello_mongoc.c" sample program is shared among four tests. add_executable (hello_mongoc ../../hello_mongoc.c) target_link_libraries (hello_mongoc PRIVATE mongo::mongoc_static)
pkg-config
Cake を使用していない場合は、コマンドラインで pkg-config を使用して ヘッダーとライブラリ パスを設定します。
gcc -o hello_mongoc hello_mongoc.c $(pkg-config --libs --cflags libmongoc-1.0)
または libmongoc に静的にリンクするには次のようにします。
gcc -o hello_mongoc hello_mongoc.c $(pkg-config --libs --cflags libmongoc-static-1.0)
ヘッダー パスとインクルージョン パスの手動指定
C# または pkg-config を使用していない場合、パスとライブラリは手動で管理できます。
$ gcc -o hello_mongoc hello_mongoc.c \ -I/usr/local/include/libbson-1.0 -I/usr/local/include/libmongoc-1.0 \ -lmongoc-1.0 -lbson-1.0 $ ./hello_mongoc { "ok" : 1.000000 }
Windows ユーザーの場合、コードは次のコマンドでコンパイルして実行できます。 (MongoDB C ドライバーがC:\mongo-c-driver
にインストールされていることを前提としています。必要に応じて include ディレクトリを変更します)。
C:\> cl.exe /IC:\mongo-c-driver\include\libbson-1.0 /IC:\mongo-c-driver\include\libmongoc-1.0 hello_mongoc.c C:\> hello_mongoc { "ok" : 1.000000 }
Microsoft Visual Studio プロジェクトでのlibmongoc の使用
接続の確立
Access MongoDB with a mongoc_client_t. It transparently connects to standalone servers, replica sets and sharded clusters on demand. To perform operations on a database or collection, create a mongoc_database_t or mongoc_collection_t struct from the mongoc_client_t.
At the start of an application, call mongoc_init before any other libmongoc functions. At the end, call the appropriate destroy function for each collection, database, or client handle, in reverse order from how they were constructed. Call mongoc_cleanup before exiting.
以下の例では、 localhost
上のスタンドアロン サーバーへの接続を確立し、クライアント アプリケーションを「接続例」として登録して、簡単なコマンドを実行します。
データベース操作の詳細については、「 CRUD 操作と実行コマンドの実行 」セクションを参照してください。 レプリカセットとシャーディングされたクラスターへの接続の例は [高度な接続] ページに、データ圧縮の例は [データ圧縮] ページを参照してください。
int main (int argc, char *argv[]) { const char *uri_string = "mongodb://localhost:27017"; mongoc_uri_t *uri; mongoc_client_t *client; mongoc_database_t *database; mongoc_collection_t *collection; bson_t *command, reply, *insert; bson_error_t error; char *str; bool retval; /* * Required to initialize libmongoc's internals */ mongoc_init (); /* * Optionally get MongoDB URI from command line */ if (argc > 1) { uri_string = argv[1]; } /* * Safely create a MongoDB URI object from the given string */ uri = mongoc_uri_new_with_error (uri_string, &error); if (!uri) { fprintf (stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } /* * Create a new client instance */ client = mongoc_client_new_from_uri (uri); if (!client) { return EXIT_FAILURE; } /* * Register the application name so we can track it in the profile logs * on the server. This can also be done from the URI (see other examples). */ mongoc_client_set_appname (client, "connect-example"); /* * Get a handle on the database "db_name" and collection "coll_name" */ database = mongoc_client_get_database (client, "db_name"); collection = mongoc_client_get_collection (client, "db_name", "coll_name"); /* * Do work. This example pings the database, prints the result as JSON and * performs an insert */ command = BCON_NEW ("ping", BCON_INT32 (1)); retval = mongoc_client_command_simple (client, "admin", command, NULL, &reply, &error); if (!retval) { fprintf (stderr, "%s\n", error.message); return EXIT_FAILURE; } str = bson_as_json (&reply, NULL); printf ("%s\n", str); insert = BCON_NEW ("hello", BCON_UTF8 ("world")); if (!mongoc_collection_insert_one (collection, insert, NULL, NULL, &error)) { fprintf (stderr, "%s\n", error.message); } bson_destroy (insert); bson_destroy (&reply); bson_destroy (command); bson_free (str); /* * Release our handles and clean up libmongoc */ mongoc_collection_destroy (collection); mongoc_database_destroy (database); mongoc_uri_destroy (uri); mongoc_client_destroy (client); mongoc_cleanup (); return EXIT_SUCCESS; }
BSON ドキュメントの作成
ドキュメントは MongoDB のデータ形式、BSON で保存されます。 C ドライバーはlibbsonを使用して BSON ドキュメントを作成します。 これらを構築するには、キーと値のペアを追加する方法、BCON を使用する方法、JSON を解析する方法などがあります。
BSON の追加
A BSON document, represented as a bson_t in code, can be constructed one field at a time using libbson's append functions.
たとえば、次のようなドキュメントを作成するには、次のようにします。
{ born : ISODate("1906-12-09"), died : ISODate("1992-01-01"), name : { first : "Grace", last : "Hopper" }, languages : [ "MATH-MATIC", "FLOW-MATIC", "COBOL" ], degrees: [ { degree: "BA", school: "Vassar" }, { degree: "PhD", school: "Yale" } ] }
次のコードを使用します。
int main (void) { struct tm born = {0}; struct tm died = {0}; const char *lang_names[] = {"MATH-MATIC", "FLOW-MATIC", "COBOL"}; const char *schools[] = {"Vassar", "Yale"}; const char *degrees[] = {"BA", "PhD"}; uint32_t i; bson_t *document; bson_t child; bson_array_builder_t *bab; char *str; document = bson_new (); /* * Append { "born" : ISODate("1906-12-09") } to the document. * Passing -1 for the length argument tells libbson to calculate the * string length. */ born.tm_year = 6; /* years are 1900-based */ born.tm_mon = 11; /* months are 0-based */ born.tm_mday = 9; bson_append_date_time (document, "born", -1, mktime (&born) * 1000); /* * Append { "died" : ISODate("1992-01-01") } to the document. */ died.tm_year = 92; died.tm_mon = 0; died.tm_mday = 1; /* * For convenience, this macro passes length -1 by default. */ BSON_APPEND_DATE_TIME (document, "died", mktime (&died) * 1000); /* * Append a subdocument. */ BSON_APPEND_DOCUMENT_BEGIN (document, "name", &child); BSON_APPEND_UTF8 (&child, "first", "Grace"); BSON_APPEND_UTF8 (&child, "last", "Hopper"); bson_append_document_end (document, &child); /* * Append array of strings. Generate keys "0", "1", "2". */ BSON_APPEND_ARRAY_BUILDER_BEGIN (document, "languages", &bab); for (i = 0; i < sizeof lang_names / sizeof (char *); ++i) { bson_array_builder_append_utf8 (bab, lang_names[i], -1); } bson_append_array_builder_end (document, bab); /* * Array of subdocuments: * degrees: [ { degree: "BA", school: "Vassar" }, ... ] */ BSON_APPEND_ARRAY_BUILDER_BEGIN (document, "degrees", &bab); for (i = 0; i < sizeof degrees / sizeof (char *); ++i) { bson_array_builder_append_document_begin (bab, &child); BSON_APPEND_UTF8 (&child, "degree", degrees[i]); BSON_APPEND_UTF8 (&child, "school", schools[i]); bson_array_builder_append_document_end (bab, &child); } bson_append_array_builder_end (document, bab); /* * Print the document as a JSON string. */ str = bson_as_canonical_extended_json (document, NULL); printf ("%s\n", str); bson_free (str); /* * Clean up allocated bson documents. */ bson_destroy (document); return 0; }
See the libbson documentation for all of the types that can be appended to a bson_t.
BCON の使用
BSON C Object Notation (省略すると BSON )は、BSON ドキュメントをより目的の形式に近い方法で作成する代替方法です。 BSON の追加関数よりも型の安全性は低いが、コードは少なくなります。
int main (int argc, char *argv[]) { struct tm born = { 0 }; struct tm died = { 0 }; bson_t *document; char *str; born.tm_year = 6; born.tm_mon = 11; born.tm_mday = 9; died.tm_year = 92; died.tm_mon = 0; died.tm_mday = 1; document = BCON_NEW ( "born", BCON_DATE_TIME (mktime (&born) * 1000), "died", BCON_DATE_TIME (mktime (&died) * 1000), "name", "{", "first", BCON_UTF8 ("Grace"), "last", BCON_UTF8 ("Hopper"), "}", "languages", "[", BCON_UTF8 ("MATH-MATIC"), BCON_UTF8 ("FLOW-MATIC"), BCON_UTF8 ("COBOL"), "]", "degrees", "[", "{", "degree", BCON_UTF8 ("BA"), "school", BCON_UTF8 ("Vassar"), "}", "{", "degree", BCON_UTF8 ("PhD"), "school", BCON_UTF8 ("Yale"), "}", "]"); /* * Print the document as a JSON string. */ str = bson_as_canonical_extended_json (document, NULL); printf ("%s\n", str); bson_free (str); /* * Clean up allocated bson documents. */ bson_destroy (document); return 0; }
BCON では配列、サブドキュメント、任意のフィールドを作成できることに注意してください。
JSON からの BSON の作成
For single documents, BSON can be created from JSON strings via bson_new_from_json.
int main (int argc, char *argv[]) { bson_error_t error; bson_t *bson; char *string; const char *json = "{\"name\": {\"first\":\"Grace\", \"last\":\"Hopper\"}}"; bson = bson_new_from_json ((const uint8_t *)json, -1, &error); if (!bson) { fprintf (stderr, "%s\n", error.message); return EXIT_FAILURE; } string = bson_as_canonical_extended_json (bson, NULL); printf ("%s\n", string); bson_free (string); return 0; }
To initialize BSON from a sequence of JSON documents, use bson_json_reader_t.
基本的な CRUD 操作
このセクションでは、C ドライバー を使用して MongoDB を操作する方法の基本を説明します。
ドキュメントの挿入
To insert documents into a collection, first obtain a handle to a mongoc_collection_t
via a mongoc_client_t
. Then, use mongoc_collection_insert_one to add BSON documents to the collection. This example inserts into the database "mydb" and collection "mycoll".
終了したら、それぞれの破棄関数を使用して、割り当てられた構造が解放されていることを確認します。
int main (int argc, char *argv[]) { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; bson_oid_t oid; bson_t *doc; mongoc_init (); client = mongoc_client_new ("mongodb://localhost:27017/?appname=insert-example"); collection = mongoc_client_get_collection (client, "mydb", "mycoll"); doc = bson_new (); bson_oid_init (&oid, NULL); BSON_APPEND_OID (doc, "_id", &oid); BSON_APPEND_UTF8 (doc, "hello", "world"); if (!mongoc_collection_insert_one ( collection, doc, NULL, NULL, &error)) { fprintf (stderr, "%s\n", error.message); } bson_destroy (doc); mongoc_collection_destroy (collection); mongoc_client_destroy (client); mongoc_cleanup (); return 0; }
コードをコンパイルして実行します。
$ gcc -o insert insert.c $(pkg-config --cflags --libs libmongoc-1.0) $ ./insert
Windows の場合:
C:\> cl.exe /IC:\mongo-c-driver\include\libbson-1.0 /IC:\mongo-c-driver\include\libmongoc-1.0 insert.c C:\> insert
挿入が成功したことを確認するには、MongoDB shell に接続します。
$ mongo MongoDB shell version: 3.0.6 connecting to: test > use mydb switched to db mydb > db.mycoll.find() { "_id" : ObjectId("55ef43766cb5f36a3bae6ee4"), "hello" : "world" } >
ドキュメントの検索
To query a MongoDB collection with the C driver, use the function mongoc_collection_find_with_opts. This returns a cursor to the matching documents. The following examples iterate through the result cursors and print the matches to stdout
as JSON strings.
クエリ指定子としてドキュメントを使用します。たとえば、
{ "color" : "red" }
は、値が「red」である「core」という名前のフィールドを持つ任意のドキュメントと一致します。 空のドキュメント{}
はすべてのドキュメントを一致させるために使用できます。
この最初の例では、空のクエリ指定子を使用して、データベース "mydb" とコレクション "mycoll" 内のすべてのドキュメントを検索します。
int main (int argc, char *argv[]) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; const bson_t *doc; bson_t *query; char *str; mongoc_init (); client = mongoc_client_new ("mongodb://localhost:27017/?appname=find-example"); collection = mongoc_client_get_collection (client, "mydb", "mycoll"); query = bson_new (); cursor = mongoc_collection_find_with_opts (collection, query, NULL, NULL); while (mongoc_cursor_next (cursor, &doc)) { str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); } bson_destroy (query); mongoc_cursor_destroy (cursor); mongoc_collection_destroy (collection); mongoc_client_destroy (client); mongoc_cleanup (); return 0; }
コードをコンパイルして実行します。
$ gcc -o find find.c $(pkg-config --cflags --libs libmongoc-1.0) $ ./find { "_id" : { "$oid" : "55ef43766cb5f36a3bae6ee4" }, "hello" : "world" }
Windows の場合:
C:\> cl.exe /IC:\mongo-c-driver\include\libbson-1.0 /IC:\mongo-c-driver\include\libmongoc-1.0 find.c C:\> find { "_id" : { "$oid" : "55ef43766cb5f36a3bae6ee4" }, "hello" : "world" }
特定のドキュメントを検索するには、 query
に指定子を追加します。 この例では、 BSON_APPEND_UTF8()
への呼び出しを追加して、 {"hello" : "world"}
に一致するすべてのドキュメントを検索します。
int main (int argc, char *argv[]) { mongoc_client_t *client; mongoc_collection_t *collection; mongoc_cursor_t *cursor; const bson_t *doc; bson_t *query; char *str; mongoc_init (); client = mongoc_client_new ( "mongodb://localhost:27017/?appname=find-specific-example"); collection = mongoc_client_get_collection (client, "mydb", "mycoll"); query = bson_new (); BSON_APPEND_UTF8 (query, "hello", "world"); cursor = mongoc_collection_find_with_opts (collection, query, NULL, NULL); while (mongoc_cursor_next (cursor, &doc)) { str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); } bson_destroy (query); mongoc_cursor_destroy (cursor); mongoc_collection_destroy (collection); mongoc_client_destroy (client); mongoc_cleanup (); return 0; }
$ gcc -o find-specific find-specific.c $(pkg-config --cflags --libs libmongoc-1.0) $ ./find-specific { "_id" : { "$oid" : "55ef43766cb5f36a3bae6ee4" }, "hello" : "world" }
C:\> cl.exe /IC:\mongo-c-driver\include\libbson-1.0 /IC:\mongo-c-driver\include\libmongoc-1.0 find-specific.c C:\> find-specific { "_id" : { "$oid" : "55ef43766cb5f36a3bae6ee4" }, "hello" : "world" }
ドキュメントの更新
This code snippet gives an example of using mongoc_collection_update_one to update the fields of a document.
次の例では、「mydb」データベースを使用して、「mycoll」コレクションにサンプル ドキュメントを挿入しています。 次に、 _id
フィールドを使用して、ドキュメントは別の値と新しいフィールドで更新されます。
int main (int argc, char *argv[]) { mongoc_collection_t *collection; mongoc_client_t *client; bson_error_t error; bson_oid_t oid; bson_t *doc = NULL; bson_t *update = NULL; bson_t *query = NULL; mongoc_init (); client = mongoc_client_new ("mongodb://localhost:27017/?appname=update-example"); collection = mongoc_client_get_collection (client, "mydb", "mycoll"); bson_oid_init (&oid, NULL); doc = BCON_NEW ("_id", BCON_OID (&oid), "key", BCON_UTF8 ("old_value")); if (!mongoc_collection_insert_one (collection, doc, NULL, &error)) { fprintf (stderr, "%s\n", error.message); goto fail; } query = BCON_NEW ("_id", BCON_OID (&oid)); update = BCON_NEW ("$set", "{", "key", BCON_UTF8 ("new_value"), "updated", BCON_BOOL (true), "}"); if (!mongoc_collection_update_one ( collection, query, update, NULL, NULL, &error)) { fprintf (stderr, "%s\n", error.message); goto fail; } fail: if (doc) bson_destroy (doc); if (query) bson_destroy (query); if (update) bson_destroy (update); mongoc_collection_destroy (collection); mongoc_client_destroy (client); mongoc_cleanup (); return 0; }
コードをコンパイルして実行します。
$ gcc -o update update.c $(pkg-config --cflags --libs libmongoc-1.0) $ ./update
Windows の場合:
C:\> cl.exe /IC:\mongo-c-driver\include\libbson-1.0 /IC:\mongo-c-driver\include\libmongoc-1.0 update.c C:\> update { "_id" : { "$oid" : "55ef43766cb5f36a3bae6ee4" }, "hello" : "world" }
更新が成功したことを確認するには、MongoDB shell に接続します。
$ mongo MongoDB shell version: 3.0.6 connecting to: test > use mydb switched to db mydb > db.mycoll.find({"updated" : true}) { "_id" : ObjectId("55ef549236fe322f9490e17b"), "updated" : true, "key" : "new_value" } >
ドキュメントの削除
This example illustrates the use of mongoc_collection_delete_one to delete a document.
次のコードは、サンプル ドキュメントを データベース "mydb" と コレクション "mycoll" に挿入します。 次に、 {"hello" : "world"}
に一致するすべてのドキュメントが削除されます。
int main (int argc, char *argv[]) { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; bson_oid_t oid; bson_t *doc; mongoc_init (); client = mongoc_client_new ("mongodb://localhost:27017/?appname=delete-example"); collection = mongoc_client_get_collection (client, "test", "test"); doc = bson_new (); bson_oid_init (&oid, NULL); BSON_APPEND_OID (doc, "_id", &oid); BSON_APPEND_UTF8 (doc, "hello", "world"); if (!mongoc_collection_insert_one (collection, doc, NULL, &error)) { fprintf (stderr, "Insert failed: %s\n", error.message); } bson_destroy (doc); doc = bson_new (); BSON_APPEND_OID (doc, "_id", &oid); if (!mongoc_collection_delete_one ( collection, doc, NULL, NULL, &error)) { fprintf (stderr, "Delete failed: %s\n", error.message); } bson_destroy (doc); mongoc_collection_destroy (collection); mongoc_client_destroy (client); mongoc_cleanup (); return 0; }
コードをコンパイルして実行します。
$ gcc -o delete delete.c $(pkg-config --cflags --libs libmongoc-1.0) $ ./delete
Windows の場合:
C:\> cl.exe /IC:\mongo-c-driver\include\libbson-1.0 /IC:\mongo-c-driver\include\libmongoc-1.0 delete.c C:\> delete
MongoDB shell を使用して、ドキュメントが正常に削除されたことを証明します。
$ mongo MongoDB shell version: 3.0.6 connecting to: test > use mydb switched to db mydb > db.mycoll.count({"hello" : "world"}) 0 >
ドキュメントをカウント
MongoDB コレクション内のドキュメント数をカウントする方法は、検索操作を実行するのと同様です。 この例では、データベース「mydb」とコレクション「mycoll」内で{"hello" : "world"}
に一致するドキュメントの数をカウントします。
int main (int argc, char *argv[]) { mongoc_client_t *client; mongoc_collection_t *collection; bson_error_t error; bson_t *doc; int64_t count; mongoc_init (); client = mongoc_client_new ("mongodb://localhost:27017/?appname=count-example"); collection = mongoc_client_get_collection (client, "mydb", "mycoll"); doc = bson_new_from_json ( (const uint8_t *) "{\"hello\" : \"world\"}", -1, &error); count = mongoc_collection_count ( collection, MONGOC_QUERY_NONE, doc, 0, 0, NULL, &error); if (count < 0) { fprintf (stderr, "%s\n", error.message); } else { printf ("%" PRId64 "\n", count); } bson_destroy (doc); mongoc_collection_destroy (collection); mongoc_client_destroy (client); mongoc_cleanup (); return 0; }
コードをコンパイルして実行します。
$ gcc -o count count.c $(pkg-config --cflags --libs libmongoc-1.0) $ ./count 1
Windows の場合:
C:\> cl.exe /IC:\mongo-c-driver\include\libbson-1.0 /IC:\mongo-c-driver\include\libmongoc-1.0 count.c C:\> count 1
コマンドの実行
このドライバーは、クライアント、データベース、およびコレクション構造で MongoDB コマンドを実行するためのヘルパー関数を提供します。 _simple
バリアントは、成功または失敗を示すブール値を返します。
この例では、データベース「mydb」に対してpingコマンドを実行します。
int main (void) { mongoc_client_t *client; bson_error_t error; bson_t *command; bson_t reply; char *str; mongoc_init (); client = mongoc_client_new ("mongodb://localhost:27017/?appname=executing-example"); command = BCON_NEW ("ping", BCON_INT32 (1)); if (mongoc_client_command_simple (client, "mydb", command, NULL, &reply, &error)) { str = bson_as_canonical_extended_json (&reply, NULL); printf ("%s\n", str); bson_free (str); } else { fprintf (stderr, "Failed to run command: %s\n", error.message); } bson_destroy (command); bson_destroy (&reply); mongoc_client_destroy (client); mongoc_cleanup (); return 0; }
コードをコンパイルして実行します。
$ gcc -o executing executing.c $(pkg-config --cflags --libs libmongoc-1.0) $ ./executing { "ok" : { "$numberDouble" : "1.0" }, "$clusterTime" : { "clusterTime" : { "$timestamp" : { "t" : 1682609211, "i" : 1 } }, "signature" : { "hash" : { "$binary" : { "base64" : "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", "subType" : "00" } }, "keyId" : { "$numberLong" : "0" } } }, "operationTime" : { "$timestamp" : { "t" : 1682609211, "i" : 1 } } }
Windows の場合:
C:\> cl.exe /IC:\mongo-c-driver\include\libbson-1.0 /IC:\mongo-c-driver\include\libmongoc-1.0 executing.c C:\> executing { "ok" : { "$numberDouble" : "1.0" }, "$clusterTime" : { "clusterTime" : { "$timestamp" : { "t" : 1682609211, "i" : 1 } }, "signature" : { "hash" : { "$binary" : { "base64" : "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", "subType" : "00" } }, "keyId" : { "$numberLong" : "0" } } }, "operationTime" : { "$timestamp" : { "t" : 1682609211, "i" : 1 } } }
スレッド化
MongoDB C ドライバーは、操作の大部分でスレッド認識されません。 つまり、スレッドセーフ性を保証できるかどうかはプロファイラーに依存します。
However, mongoc_client_pool_t is thread-safe and is used to fetch a mongoc_client_t
in a thread-safe manner. After retrieving a client from the pool, the client structure should be considered owned by the calling thread. When the thread is finished, the client should be placed back into the pool.
/* gcc example-pool.c -o example-pool $(pkg-config --cflags --libs * libmongoc-1.0) */ /* ./example-pool [CONNECTION_STRING] */ static pthread_mutex_t mutex; static bool in_shutdown = false; static void * worker (void *data) { mongoc_client_pool_t *pool = data; mongoc_client_t *client; bson_t ping = BSON_INITIALIZER; bson_error_t error; bool r; BSON_APPEND_INT32 (&ping, "ping", 1); while (true) { client = mongoc_client_pool_pop (pool); /* Do something with client. If you are writing an HTTP server, you * probably only want to hold onto the client for the portion of the * request performing database queries. */ r = mongoc_client_command_simple (client, "admin", &ping, NULL, NULL, &error); if (!r) { fprintf (stderr, "%s\n", error.message); } mongoc_client_pool_push (pool, client); pthread_mutex_lock (&mutex); if (in_shutdown || !r) { pthread_mutex_unlock (&mutex); break; } pthread_mutex_unlock (&mutex); } bson_destroy (&ping); return NULL; } int main (int argc, char *argv[]) { const char *uri_string = "mongodb://127.0.0.1/?appname=pool-example"; mongoc_uri_t *uri; bson_error_t error; mongoc_client_pool_t *pool; pthread_t threads[10]; unsigned i; void *ret; pthread_mutex_init (&mutex, NULL); mongoc_init (); if (argc > 1) { uri_string = argv[1]; } uri = mongoc_uri_new_with_error (uri_string, &error); if (!uri) { fprintf (stderr, "failed to parse URI: %s\n" "error message: %s\n", uri_string, error.message); return EXIT_FAILURE; } pool = mongoc_client_pool_new (uri); mongoc_client_pool_set_error_api (pool, 2); for (i = 0; i < 10; i++) { pthread_create (&threads[i], NULL, worker, pool); } sleep (10); pthread_mutex_lock (&mutex); in_shutdown = true; pthread_mutex_unlock (&mutex); for (i = 0; i < 10; i++) { pthread_join (threads[i], &ret); } mongoc_client_pool_destroy (pool); mongoc_uri_destroy (uri); mongoc_cleanup (); return EXIT_SUCCESS; }
次のステップ
高度なトピックの情報を見つけるには、 C ドライバー ガイドの残りの部分 またはMongoDB の公式ドキュメントを参照してください。
For help with common issues, consult the Troubleshooting page. バグを報告したり、新機能をリクエストしたりするには、次の手順に従います。