Rest Term

MongoDB C++クライアント


現在担当している業務で、CassandraやRedisなどいくつかのNoSQLデータベースの導入検討をしてきましたが、最終的にMongoDBを使うことになりました。アプリケーションの上の層ではPythonやPHPで作りますが、パフォーマンス要件が厳しい部分はC++ドライバを使う予定です。

まずはインストールから。
* 環境
Linux 2.6.18-194.26.1.el5 x86_64 (CentOS release 5.7)
gcc version 4.4.4 20100726

インストール

C++ドライバは BoostpcreSCons が別途必要なのでそちらを先にインストールします。Boostはインストール済みな人も多いかと思いますが、僕の環境ではバージョンが古めだったのでアップデートしました。v1.47からは bjam の他に b2 でもビルドできるようです。yumだと古いバージョンが入るのでソースからビルドします。

/usr/local/ 以下を汚したくない場合は prefix で任意のディレクトリを指定すればOKです。

次にpcreですが、こちらはyum(Debian系はapt)で入れても大丈夫です。バージョンの古さが気になる場合は Utter Ramblings レポジトリを追加してそこからインストールするといいです。

MongoDB C++ドライバのビルドには SCons を使うので、もし入っていなければインストールします。

目的のMongoDB C++ドライバ(ここではv2.0を使う)を入れます。頻繁に更新されているようなので注意してください。特にv2.0のドライバは古いものだとコンパイルに失敗することが多いようです。
C++ Driver Download

scons でも make と同様に -j オプションで並列ビルドができますが今回は付けませんでした。案の定、コンパイルにはけっこうな時間がかかってしまいましたが。。

無事にビルドできたら、出来上がった libmongoclient.so を ldd で依存関係を確認しておきます。

動作確認

インストールが終わったら動作確認。ここでは簡単なCRUD操作を試してみます。
* データベース: test, コレクション: users

* コンパイル/実行

* 出力結果

Cドライバと比べるとインタフェースはかなり高級です。

mongo::BSONObjBuilder のメソッドは内部で return *this しているのでメソッドチェーンができるようです(実際使うかどうかは別として)。この mongo::BSONObjBuilder のインスタンスは使い回したいと思うかもしれませんが、規模が大きくなってくるといろいろ罠にハマりやすいので(例えば、obj() を一度呼んでいるのに後でうっかり append() してしまうとSEGVする等)、使う度に生成するようにした方がいいような気がします。コードが読み辛くなるのを許容できるなら、BSONObjBuilder を一切使わずに BSON マクロのみでクエリを組み立てるのもいいかもしれません。

また、mongo::DBClientConnection::query() は戻り値として std::auto_ptr<mongo::DBClientCursor> を返すようになっているので注意。boost必須のドライバなんだし boost::shared_ptr を返すようにすればいいのにと思いますが、。

今回はMongoDB C++ドライバを使って簡単なCRUD操作を試してみました。今回紹介できなかったクラスもまだたくさんあるので少しずつ調べていこうと思います。

* C++ドライバ APIリファレンス
doxygen API docs

あわせて読む:

 

Tags: ,

Comments

No comments so far.

  • Leave a Reply
     
    Your gravatar
    Your Name