カーソルからデータにアクセスする
Overview
このガイドでは、 C++ドライバーを使用してカーソルからデータにアクセスする方法を学習できます。
カーソルは、読み取り操作の結果を反復可能なバッチで返すメカニズムです。 カーソルは、すべてのドキュメントを一度に返すのではなく、常にドキュメントのサブセットのみを保持することで、メモリ消費とネットワーク帯域幅使用量の両方を削減します。
C++ドライバーが find()
メソッドを使用して読み取り操作を実行するたびに、 mongocxx::cursor
インスタンスに一致するドキュメントが返されます。
サンプル データ
このガイドの例では、 Atlasサンプルデータセットのsample_restaurants
データベースのrestaurants
コレクションを使用します。 C++アプリケーションからこのコレクションにアクセスするには、Atlasmongocxx::client
クラスターに接続する をインスタンス化し、 変数と 変数に次の値を割り当てます。db
collection
auto db = client["sample_restaurants"]; auto collection = db["restaurants"];
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 「Atlas を使い始める」ガイドを参照してください。
すべてのカーソル ドキュメントを検索
mongocxx::cursor
インスタンスの内容を反復処理するには、 for
ループを使用します。
次の例では、 find()
メソッドを使用して、 name
の値が"Dunkin' Donuts"
であるすべてのドキュメントを取得します。 次に、 find()
メソッドによって返されたカーソルから各ドキュメントを出力します。
auto cursor = collection.find(make_document(kvp("name", "Dunkin' Donuts"))); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40379573" } { "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40363098" } { "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40395071" } ...
ドキュメントを個別に検索する
カーソルから個々のドキュメントを検索するには、 mongocxx::cursor
インスタンスでbegin()
メソッドを呼び出します。 このメソッドは、カーソル内の最初のドキュメントを指すmongocxx::cursor::iterator
のインスタンスを返します。
次の例では、コレクション内のname
の値が"Dunkin' Donuts"
であるすべてのドキュメントを検索します。 次に、 begin()
メソッドを呼び出して、カーソルから最初のドキュメントを出力します。
auto cursor = collection.find(make_document(kvp("name", "Dunkin' Donuts"))); auto doc = cursor.begin(); std::cout << bsoncxx::to_json(*doc) << std::endl;
{ "_id" : { "$oid" : "..." }, ... "name" : "Dunkin' Donuts", "restaurant_id" : "40379573" }
テール可能カーソル
CappedCappedコレクションをクエリする場合、クライアントがカーソルの結果を使い果たした後も開いたままになる 追尾可能 ( 追尾可能 (tailable) カーソルを使用できます。 追尾可能 ( 追尾可能 (tailable) カーソルを作成するには、 mongocxx::options::find
オブジェクトをインスタンス化し、そのcursor_type
フィールドをmongocxx::cursor::type::k_tailable
に設定します。 次に、 mongocxx::options::find
インスタンスをfind()
メソッドの引数として渡します。
例、次のコードに示すように、植物を表すドキュメントを保存するvegetables
というCappedコレクションを作成できます。
auto db = client["db"]; auto collection = db.create_collection("vegetables", make_document(kvp("capped", true), kvp("size", 1024 * 1024))); std::vector<bsoncxx::document::value> vegetables; vegetables.push_back(make_document(kvp("name", "cauliflower"))); vegetables.push_back(make_document(kvp("name", "zucchini"))); auto result = collection.insert_many(vegetables);
次のコードでは、追尾可能 (tailable) カーソルを使用して、 vegetables
コレクション内のすべてのドキュメントを検索します。 カーソルが使い果たされた後も、次の 3 つのドキュメントを検索するまで開いたままになります。
mongocxx::options::find opts{}; opts.cursor_type(mongocxx::cursor::type::k_tailable); auto cursor = collection.find({}, opts); int docs_found = 0; while (docs_found < 3) { for (auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; docs_found++; } // Sleeps for 100 milliseconds before trying to access more documents std::this_thread::sleep_for(std::chrono::milliseconds(100)); }
{ "_id" : { "$oid" : "..." }, "name" : "cauliflower" } { "_id" : { "$oid" : "..." }, "name" : "zucchini" }
vegetables
コレクションに別のドキュメントを挿入すると、上記のコードによって新しいドキュメントが出力され、 while
ループが閉じられます。
追尾可能 (tailable) カーソルの詳細については、MongoDB Server マニュアルの 追尾可能 ( tailable) カーソル のガイド を参照してください。
詳細情報
読み取り操作の詳細については、 データの取得ガイドを 参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。