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

Tutorial

項目一覧

  • 前提条件
  • コンパイル
  • 接続を行う
  • データベースへのアクセス
  • コレクションにアクセスする
  • ドキュメントの作成
  • ドキュメントの挿入
  • 1つのドキュメントの挿入
  • 複数のドキュメントの挿入
  • コレクションをクエリする
  • コレクション内の単一ドキュメントの検索
  • コレクション内の全ドキュメントの検索
  • コレクション内のすべてのドキュメントの出力
  • クエリフィルターの指定
  • Update Documents
  • 単一ドキュメントの更新
  • 複数のドキュメントの更新
  • Delete Documents
  • 単一ドキュメントの削除
  • フィルターに一致するすべてのドキュメントの削除
  • インデックスの作成

このチュートリアルの完全なコードは tuned.cpp でご覧ください 。

  • ポート27017の localhost で実行中のmongodインスタンス。

  • mongocx ドライバー。 「 のインストール 」を参照してください。

  • ソース ファイルの上部にある次のステートメント。

#include <cstdint>
#include <iostream>
#include <vector>
#include <bsoncxx/builder/basic/document.hpp>
#include <bsoncxx/json.hpp>
#include <mongocxx/client.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/stdx.hpp>
#include <mongocxx/uri.hpp>
using bsoncxx::builder::basic::kvp;
using bsoncxx::builder::basic::make_array;
using bsoncxx::builder::basic::make_document;

mongocx ドライバーのインストール プロセスでは、libmongocxx.pc pkg-config で使用するための ファイルがインストールされます。

プログラムをコンパイルするには、次のコマンドを実行します。

c++ --std=c++11 <input>.cpp $(pkg-config --cflags --libs libmongocxx)

pkg-config が使用できない場合は、コマンドラインまたは IDE で 含める フラグと ライブラリ フラグを手動で設定する必要があります。 たとえば、 libmongoc と mongocx が/usr/localにインストールされている場合、上記の のコンパイル行は次のように展開されます。

c++ --std=c++11 <input>.cpp
-I/usr/local/include/mongocxx/v_noabi \
-I/usr/local/include/bsoncxx/v_noabi \
-L/usr/local/lib -lmongocxx -lbsoncxx

重要

接続を行う前に、 mongocx::instance の 1 つのインスタンスのみを作成する必要があります。 。このインスタンスは、プログラム全体に存在する必要があります。

実行中の MongoDB インスタンスに接続するには、 mongocx:: インスタンス クラス。

mongocx::uri を使用して接続するホストを指定する必要があります インスタンスが MongoDB URI を含み、それがmongocxx::client コンストラクターに渡されます。サポートされている URI オプションの詳細については、C++ ドライバーの構築に使用される libmongoc のバージョンまたは 最新の libmongoc リリースのドキュメントを参照してください。

デフォルトのmongocxx::uriコンストラクターは、ポート27017の localhost で実行されているサーバーに接続します。

mongocxx::instance instance{}; // This should be done only once.
mongocxx::client client{mongocxx::uri{}};

これは、次の と同等です。

mongocxx::instance instance{}; // This should be done only once.
mongocxx::uri uri("mongodb://localhost:27017");
mongocxx::client client(uri);

mongocx:: インスタンス が作成されたら MongoDB 配置に接続されているdatabase() operator[]インスタンスで、 メソッドまたは を使用して mongocx::database インスタンス。

リクエストするデータベースが存在しない場合は、データを最初に保存するときに MongoDB によってデータベースが作成されます。

次の例では、 mydbデータベースにアクセスします。

auto db = client["mydb"];

mongocx::database collection()が作成されたらoperator[] インスタンス: メソッドまたは のいずれかを使用して mongocx::collection を取得します インスタンス。

リクエストしたコレクションが存在しない場合、MongoDB は最初にデータを保存するときにコレクションを作成します。

たとえば、次のステートメントは、前のセクションで作成されたdbインスタンスを使用して、 mydbデータベース内のtestという名前のコレクションにアクセスします。

auto collection = db["test"];

C++ ドライバーを使用してdocumentを作成するには、使用可能な 2 つのビルダ インターフェイスのいずれかを使用します。

  • ストリーム ビルダ: bsoncxx::builder::stream
    リテラル ドキュメント構築に適した ストリーミング演算子 を使用するドキュメント ビルダー。
  • 基本ビルダ: bsoncxx::builder::basic
    ビルダ インスタンスでメソッドを呼び出す、より従来のドキュメント ビルダ。

このガイドでは、基本ビルダについて簡単に説明します。

たとえば、次の JSON ドキュメントについて考えてみます。

{
"name" : "MongoDB",
"type" : "database",
"count" : 1,
"versions": [ "v6.0", "v5.0", "v4.4", "v4.2", "v4.0", "v3.6" ],
"info" : {
"x" : 203,
"y" : 102
}
}

基本的なビルダを使用すると、次のようにこのドキュメントを構築できます。

auto doc_value = make_document(
kvp("name", "MongoDB"),
kvp("type", "database"),
kvp("count", 1),
kvp("versions", make_array("v6.0", "v5.0", "v4.4", "v4.2", "v4.0", "v3.6")),
kvp("info", make_document(kvp("x", 203), kvp("y", 102)))
);

このbsoncxx::document::value型は、独自のメモリを所有する読み取り専用オブジェクトです。 これを使用するには、 bsoncx::document::view を取得する必要があります。 メソッドを使用する場合view()

auto doc_view = doc_value.view();

を使用してこのドキュメントoperator[] ビュー内のフィールドにアクセスできます。これにより bsoncx::document:: 要素 が返されます インスタンス。たとえば、次の例では、値が string であるnameフィールドが抽出されます。

auto element = doc_view["name"];
assert(element.type() == bsoncxx::type::k_string);
auto name = element.get_string().value; // For C++ driver version < 3.7.0, use get_utf8()
assert(0 == name.compare("MongoDB"));

名前フィールドの値が string ではなく、前の例に示すように型保護を含めない場合、このコードは bsoncx:: 例外 のインスタンスをスローします。

コレクションに単一のドキュメントを挿入するには、 mongocx::collection インスタンスの メソッドを使用してinsert_one() { "i": 0 }を挿入します。

auto insert_one_result = collection.insert_one(make_document(kvp("i", 0)));

insert_one_result は任意の mongocx:result::insert_one 。この例では、 insert_one_resultが設定されることが予想されています。 書込み (write) 操作のデフォルトの動作は、サーバーからの応答を待つことです。 これは、確認されていない mongocx::write_concern を設定することで上書きされる可能性があります。

assert(insert_one_result); // Acknowledged writes return results.

ドキュメントに最上位の_idフィールドを指定しない場合、MongoDB は挿入されたドキュメントに_idフィールドを自動的に追加します。

この値は、返されたinserted_id() mongocx::result::insert_one の メソッドを使用して取得できます インスタンス。

auto doc_id = insert_one_result->inserted_id();
assert(doc_id.type() == bsoncxx::type::k_oid);

コレクションに複数のドキュメントを挿入するには、 mongocx::collection インスタンスのinsert_many() メソッドは、挿入するドキュメントのリストを受け取ります。

次の例では、ドキュメント{ "i": 1 }{ "i": 2 }を挿入しています。 ドキュメントを作成し、ドキュメント リストに追加します。

std::vector<bsoncxx::document::value> documents;
documents.push_back(make_document(kvp("i", 1)));
documents.push_back(make_document(kvp("i", 2)));

これらのドキュメントをコレクションに挿入するには、ドキュメントのリストをinsert_many()メソッドに渡します。

auto insert_many_result = collection.insert_many(documents);
assert(insert_many_result); // Acknowledged writes return results.

各ドキュメントで最上位の_idフィールドを指定しない場合、MongoDB は挿入されたドキュメントに自動的に_idフィールドを追加します。

この値は、返されたinserted_ids() mongocx::result::insert_many の メソッドを使用して取得できます インスタンス。

auto doc0_id = insert_many_result->inserted_ids().at(0);
auto doc1_id = insert_many_result->inserted_ids().at(1);
assert(doc0_id.type() == bsoncxx::type::k_oid);
assert(doc1_id.type() == bsoncxx::type::k_oid);

コレクションをクエリするには、コレクションのfind() メソッドとfind_one() メソッドを使用します。

find() mongocx::cursor のインスタンスを返します。 は、 がfind_one() std::optional< bsoncxx::document::value >のインスタンスを返します。詳しくは、「 bsoncx::document::value 」を参照してください。

空のドキュメントを指定して コレクション内のすべてのドキュメントをクエリするか、フィルターを渡してフィルター条件に一致するドキュメントをクエリできます。

コレクション内の単一のドキュメントを返すには、パラメータなしでfind_one()メソッドを使用します。

auto find_one_result = collection.find_one({});
if (find_one_result) {
// Do something with *find_one_result
}
assert(find_one_result);
auto cursor_all = collection.find({});
for (auto doc : cursor_all) {
// Do something with doc
assert(doc["_id"].type() == bsoncxx::type::k_oid);
}

bsoncx::to_json 関数は BSON ドキュメントを JSON string に変換します。

auto cursor_all = collection.find({});
std::cout << "collection " << collection.name()
<< " contains these documents:" << std::endl;
for (auto doc : cursor_all) {
std::cout << bsoncxx::to_json(doc, bsoncxx::ExtendedJsonMode::k_relaxed) << std::endl;
}
std::cout << std::endl;

上記の例では、次のような出力が印刷されます。

collection test contains these documents:
{ "_id" : { "$oid" : "6409edb48c37f371c70f03a1" }, "i" : 0 }
{ "_id" : { "$oid" : "6409edb48c37f371c70f03a2" }, "i" : 1 }
{ "_id" : { "$oid" : "6409edb48c37f371c70f03a3" }, "i" : 2 }

_id要素は MongoDB によってドキュメントに自動的に追加され、値は表示されている値とは異なります。 MongoDB では、内部使用のためにアンダースコア( _ )とドル記号( $ )で始まるフィールド名が予約されます。

フィールドiの値が0である最初のドキュメントを検索するには、ドキュメント{"i": 0}を渡して等価条件を指定します。

auto find_one_filtered_result = collection.find_one(make_document(kvp("i", 0)));
if (find_one_filtered_result) {
// Do something with *find_one_filtered_result
}

次の例では、 0 < "i" <= 2であるすべてのドキュメントを取得しています。

auto cursor_filtered =
collection.find(make_document(kvp("i", make_document(kvp("$gt", 0), kvp("$lte", 2)))));
for (auto doc : cursor_filtered) {
// Do something with doc
assert(doc["_id"].type() == bsoncxx::type::k_oid);
}

コレクション内のドキュメントを更新するには、コレクションのupdate_one() メソッドとupdate_many() メソッドを使用できます。

更新メソッドはstd::optional< mongocxx::result::update >のインスタンスを返します。このインスタンスは、更新によって変更されたドキュメント数などの操作に関する情報を提供します。 詳しくは、「 mongocx::result::update 」を参照してください。

最大で 1 つのドキュメントを更新するには、 update_one()メソッドを使用します。

次の例では、フィルター{ "i": 0 }に一致する最初のドキュメントを更新し、 fooの値をbarに設定します。

auto update_one_result =
collection.update_one(make_document(kvp("i", 0)),
make_document(kvp("$set", make_document(kvp("foo", "bar")))));
assert(update_one_result); // Acknowledged writes return results.
assert(update_one_result->modified_count() == 1);

フィルターに一致するすべてのドキュメントを更新するには、 update_many()メソッドを使用します。

次の例では、 i0より大きい場合、 fooの値をbuzzに設定します。

auto update_many_result =
collection.update_many(make_document(kvp("i", make_document(kvp("$gt", 0)))),
make_document(kvp("$set", make_document(kvp("foo", "buzz")))));
assert(update_many_result); // Acknowledged writes return results.
assert(update_many_result->modified_count() == 2);

コレクションからドキュメントを削除するには、コレクションのdelete_one() メソッドとdelete_many() メソッドを使用できます。

削除 メソッドは、削除されたドキュメントの数を含むstd::optional< mongocxx::result::delete >のインスタンスを返します。 詳しくは、「 mongocx::result::delete 」を参照してください。

フィルターに一致するドキュメントを最大で 1 つ削除するには、 delete_one()メソッドを使用します。

たとえば、フィルター{ "i": 0 }に一致するドキュメントを削除するには、次の操作を実行します。

auto delete_one_result = collection.delete_one(make_document(kvp("i", 0)));
assert(delete_one_result); // Acknowledged writes return results.
assert(delete_one_result->deleted_count() == 1);

フィルターに一致するすべてのドキュメントを削除するには、コレクションのdelete_many()メソッドを使用します。

次の例では、 i0より大きいすべてのドキュメントを削除しています。

auto delete_many_result =
collection.delete_many(make_document(kvp("i", make_document(kvp("$gt", 0)))));
assert(delete_many_result); // Acknowledged writes return results.
assert(delete_many_result->deleted_count() == 2);

フィールドまたはフィールドのセットに インデックス を作成するには、インデックス仕様ドキュメントをcreate_index() mongocx::collection の メソッドに渡します。 インスタンス。インデックスキー仕様ドキュメントには、インデックスを作成するフィールドと各フィールドのインデックスタイプが含まれています。

{ "index1": "<type>", "index2": "<type>" }
  • 昇順のインデックス タイプの場合は、 <type>の1を指定します。

  • 降順のインデックス タイプでは、 <type>の - 1を指定します。

次の例では、 iフィールドに昇順のインデックスを作成しています。

auto index_specification = make_document(kvp("i", 1));
collection.create_index(std::move(index_specification));

戻る

クライアントサイドのフィールド レベル暗号化