Retrieve Data
Overview
このガイドでは、 C++ドライバーを使用して、読み取り操作によりMongoDBコレクションからデータを検索する方法を学習できます。 コレクションで find()
またはfind_one()
メソッドを呼び出して、基準のセットに一致するドキュメントを検索できます。
サンプル データ
このガイドの例では、 Atlasサンプルデータセットのsample_training
データベースのcompanies
コレクションを使用します。 C++アプリケーションからこのコレクションにアクセスするには、Atlasmongocxx::client
クラスターに接続する をインスタンス化し、 変数と 変数に次の値を割り当てます。db
collection
auto db = client["sample_training"]; auto collection = db["companies"];
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 「Atlas を使い始める」ガイドを参照してください。
ドキュメントの検索
C++ドライバーには、コレクションからドキュメントを検索するための 2 つのメソッドfind_one()
とfind()
が含まれています。 これらのメソッドはクエリフィルターを受け取り、1 つ以上の一致するドキュメントを返します。 クエリフィルターは、クエリで検索するドキュメントを指定するオブジェクトです。
Tip
クエリフィルターの詳細については、「 クエリの指定 」を参照してください。
1 つのドキュメントの検索
コレクション内の 1 つのドキュメントを検索するには、 find_one()
メソッドを呼び出し、検索するドキュメントの基準を指定するクエリフィルターを渡します。
find_one()
メソッドはstd::optional< bsoncxx::document::value >
のインスタンスを返します。 クエリフィルターがドキュメントと一致する場合、 optional
オブジェクトにはbsoncxx::document::value
型の値が含まれます。 クエリフィルターがどのドキュメントにも一致しない場合、 optional
オブジェクトには値が含まれません。
クエリフィルターが複数のドキュメントに一致する場合、 find_one()
メソッドは検索した結果から最初に一致するドキュメントを返します。
Tip
find_one()
メソッドは、一致するドキュメントが 1 つしかないことがわかっている場合や、最初の一致のみに該当する場合に便利です。
次の例では、 find_one()
メソッドを使用して、 name
フィールドの値が"LinkedIn"
になっている最初のドキュメントを検索します。
auto result = collection.find_one(make_document(kvp("name", "LinkedIn"))); std::cout << bsoncxx::to_json(*result) << std::endl;
{ "_id" : { "$oid" : "52cdef7c4bab8bd675297e0c" }, "name" : "LinkedIn", "permalink" : "linkedin", "crunchbase_url" : "http://www.crunchbase.com/company/linkedin", "homepage_url" : "http://linkedin.com", ...
並べ替えについて詳しくは、「 返すドキュメントを指定する 」ガイドの「並べ替え」セクションを参照してください。
複数ドキュメントの検索
コレクション内の複数のドキュメントを検索するには、検索するドキュメントの基準を指定するクエリフィルターを find()
メソッドに渡します。
次の例では、 find()
メソッドを使用して、 founded_year
フィールドの値が1970
であるすべてのドキュメントを検索します。
auto cursor = collection.find(make_document(kvp("founded_year", 1970)));
find()
メソッドはmongocxx::cursor
のインスタンスを返します。これを反復処理して一致するドキュメントを確認できます。 カーソルは、アプリケーションがデータベースの結果を反復処理しながら、特定の時点でメモリ内に結果のサブセットのみを保持できるようにするメカニズムです。 カーソルは、 find()
メソッドが大量のドキュメントを返す場合に便利です。
次の例に示すように、範囲ベースの for
ループを使用して、カーソル内のドキュメントを反復処理できます。
auto cursor = collection.find(make_document(kvp("founded_year", 1970))); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : { "$oid" : "52cdef7d4bab8bd675298be4" }, "name" : "Mitsubishi Motors", "permalink" : "mitsubishi-motors", "crunchbase_url" : "http://www.crunchbase.com/company/mitsubishi-motors", ... { "_id" : { "$oid" : "52cdef7e4bab8bd67529b996" }, "name" : "Western Digital", "permalink" : "western-digital", "crunchbase_url" : "http://www.crunchbase.com/company/western-digital", ... { "_id" : { "$oid" : "52cdef7e4bab8bd67529b9f1" }, "name" : "Celarayn", "permalink" : "celarayn", "crunchbase_url" : "http://www.crunchbase.com/company/celarayn", ...
注意
すべてのドキュメントの検索
コレクション内のすべてのドキュメントを検索するには、 find()
メソッドに空のフィルターを渡します。
auto cursor = collection.find({})
検索動作の変更
mongocxx::options::find
クラスのインスタンスをパラメーターとして渡すことで、 find()
メソッドとfind_one()
メソッドの動作を変更できます。 次の表では、 mongocxx::options::find
インスタンスで設定できるフィールドの一部について説明しています。
フィールド | 説明 |
---|---|
| The number of documents to return per batch. Type: std::int32_t |
| The collation to use for the operation. Type: bsoncxx::document::view_or_value |
| The comment to attach to the operation. Type: bsoncxx::string::view_or_value |
| The type of cursor to use for the operation. Type: cursor::type |
| The maximum number of documents the operation can return. Type: std::int64_t |
| The number of documents to skip before returning results. Type: std::int64_t |
| The order in which the operation returns matching documents. Type: bsoncxx::document::view_or_value |
次の例では、 find()
メソッドを使用して、 number_of_employees
フィールドの値が1000
であるすべてのドキュメントを検索し、最大5
の結果を返すように操作に指示します。
mongocxx::options::find opts; opts.limit(5); auto cursor = collection.find(make_document(kvp("number_of_employees", 1000)), opts);
mongocxx::options::find
オブジェクトフィールドの完全なリストについては、 APIドキュメントを参照してください。
詳細情報
クエリフィルターの詳細については、「クエリの指定」を参照してください。
C++ドライバーを使用してドキュメントを取得する実行可能なコード例については、「 MongoDBからのデータの読み取り 」を参照してください。
API ドキュメント
このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。