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

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

項目一覧

  • Overview
  • すべてのカーソル ドキュメントを検索
  • ドキュメントを個別に検索する
  • テール可能カーソル
  • 詳細情報

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

カーソルは、読み取り操作の結果を反復可能なバッチで返すメカニズムです。 カーソルは、すべてのドキュメントを一度に返すのではなく、常にドキュメントのサブセットのみを保持することで、メモリ消費とネットワーク帯域幅使用量の両方を削減します。

C++ドライバーが find()メソッドを使用して読み取り操作を実行するたびに、 mongocxx::cursorインスタンスに一致するドキュメントが返されます。

このガイドの例では、 Atlasサンプルデータセットsample_restaurantsデータベースのrestaurantsコレクションを使用します。 C++アプリケーションからこのコレクションにアクセスするには、Atlasmongocxx::client クラスターに接続する をインスタンス化し、 変数と 変数に次の値を割り当てます。dbcollection

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 ドキュメントを参照してください。

戻る

ドキュメントをカウント