Docs Menu
Docs Home
/ / /
C ドライバー
/

カーソルからデータにアクセスする

項目一覧

  • Overview
  • カーソルの内容に反復的にアクセスする
  • ドキュメントを個別に検索する
  • カーソルを閉じる
  • テール可能カーソル
  • トラブルシューティング
  • API ドキュメント

このガイドでは、 Cドライバーを使用してカーソルからデータにアクセスする方法を学習できます。

カーソルは、読み取り操作の結果を反復可能なバッチで返すメカニズムです。 カーソルは一度にドキュメントのサブセットのみを保持するため、メモリ消費とドライバーがサーバーに送信するリクエスト数の両方を削減します。

Cドライバーが複数のドキュメントを返す読み取り操作を実行するたびに、それらのドキュメントをカーソルで自動的に返します。

このガイドの例では、 Atlas サンプル データセットsample_restaurantsデータベース内の restaurantsコレクションを使用します。 MongoDB Atlas クラスターを無料で作成して、サンプル データセットをロードする方法については、 「 Atlas を使い始める 」ガイドを参照してください。

カーソルの内容を反復処理するには、 when ループを使用します。次の例では、restaurantsコレクション内のすべてのドキュメントを検索し、カーソルを反復処理して各ドキュメントを出力します。

const bson_t *doc;
bson_t *filter = bson_new ();
mongoc_cursor_t *results =
mongoc_collection_find_with_opts (collection, filter, NULL, NULL);
while (mongoc_cursor_next (results, &doc)) {
char *str = bson_as_canonical_extended_json (doc, NULL);
printf ("%s\n", str);
bson_free (str);
}
mongoc_cursor_destroy (results);
bson_destroy (filter);
{ "_id" : { "$oid" : "..." }, ... , "name" : "Golden Pavillion", "restaurant_id" : "40363920" }
{ "_id" : { "$oid" : "..." }, ... , "name" : "Morris Park Bake Shop", "restaurant_id" : "30075445" }
{ "_id" : { "$oid" : "..." }, ... , "name" : "Criminal Court Bldg Cafeteria", "restaurant_id" : "40364443" }
{ "_id" : { "$oid" : "..." }, ... , "name" : "7B Bar", "restaurant_id" : "40364518" }
{ "_id" : { "$oid" : "..." }, ... , "name" : "Nyac Main Dining Room", "restaurant_id" : "40364467" }
...

カーソルからドキュメントを個別に取得するには、mongoc_cursor_next() 関数を呼び出します。この関数はカーソルを反復処理し、bson パラメータをカーソル内の次のドキュメントに設定します。

次の例では、name の値が "Dunkin' Donuts" であるコレクション内のすべてのドキュメントを検索します。次に、mongoc_cursor_next() 関数を呼び出してカーソルの最初のドキュメントを出力します。

const bson_t *doc;
bson_t *filter = BCON_NEW ("name", BCON_UTF8 ("Dunkin' Donuts"));
mongoc_cursor_t *results =
mongoc_collection_find_with_opts (collection, filter, NULL, NULL);
mongoc_cursor_next (results, &doc);
char *str = bson_as_canonical_extended_json (doc, NULL);
printf ("%s\n", str);
bson_free (str);
mongoc_cursor_destroy (results);
bson_destroy (filter);
{ "_id" : { "$oid" : "..." }, ... , "name" : "Dunkin' Donuts", "restaurant_id" : "40392410" }

カーソルを閉じて関連付けられているすべてのリソースを解放するには、次の例に示すように mongoc_cursor_destroy() 関数を呼び出します。

mongoc_cursor_destroy (cursor);

CappedCappedコレクションをクエリする場合、クライアントがカーソルの結果を使い果たした後も開いたままになる 追尾可能 ( 追尾可能 (tailable) カーソルを使用できます。 CappedCappedコレクションに追尾可能 (tailable) カーソルを作成するには、tailable awaitData検索操作を実行するときに オプションと オプションを指定します。

次の例では、Cappedコレクションに 追尾可能 (tailable) カーソル を作成します。

collection = mongoc_client_get_collection (client, "<database>", "<capped collection>");
bson_t *filter = bson_new ();
bson_t *opts = BCON_NEW ("tailable", BCON_BOOL (true),
"awaitData", BCON_BOOL (true));
mongoc_cursor_t *tailable_cursor =
mongoc_collection_find_with_opts(collection, filter, opts, NULL);
// Perform operations with tailable cursor here
mongoc_cursor_destroy (tailable_cursor);
bson_destroy (filter);
bson_destroy (opts);

追尾可能 (tailable) カーソルとその使用方法の詳細については、 マニュアルの 追尾可能 (tailable) カーソルMongoDB Server のガイド を参照してください。

MongoDBのカーソルは、サーバー上で操作が実行されずに長時間開いていると、サーバー上でタイムアウトすることがあります。これにより、カーソルを反復処理しようとすると、CursorNotFound の例外が発生する可能性があります。この問題を解決するには、新しいカーソルを開きます。

このガイドで説明されている関数の詳細については、次のAPIドキュメントを参照してください。

戻る

個別のフィールド値