C言語でMongoDBを使う

  • 4
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

環境構築

まずは開発環境を構築する。
dockerのtukiyo3/centos7-ja-systemdイメージで動作を確認しています。
systemdをインストールされているのでコンテナ内でserviceコマンドが使用可能です。

docker_tukiyo3/centos7-ja-systemd
yum update -y

Mongoのリポジトリを追加。mongodb.repoを新規に作成する。

/etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
centos7
yum install -y mongodb-org  # mongodbインストール
# mongodbドライバインストール
yum install -y make git gcc automake autoconf libtool    # driverインストールに必要なもの
git clone https://github.com/mongodb/mongo-c-driver.git  # driverのソース
cd mongo-c-driver
./autogen.sh
make
sudo make install

centos6でやると./autogen.shの所でコケてしまう。
autoconfとかのバージョンとかが悪さしてるのかなぁ。

データベースの設定

テスト用のデータを入れていく。

service mongod start     # mongodbサーバ起動
mongo                    # mongodbサーバ接続
use db_test              # DB作成
# コレクション作成、ドキュメント投入
db.cl_test.insert({id:1, name:'aaa'});
db.cl_test.insert({id:2, name:'bbb'});
db.cl_test.insert({id:3, name:'ccc'});
exit

ソースコード

mongo.c
#include <bson.h>
#include <bcon.h>
#include <mongoc.h>
#include <stdio.h>
#include <stdlib.h>

int main( void ){
  mongoc_client_t *     conn    = NULL;
  mongoc_collection_t * coll    = NULL;
  mongoc_cursor_t *     cusr    = NULL;
  const bson_t *        doc     = NULL;
  char *                ret_str = NULL;
  bson_t                query;
  // DB接続
  conn = mongoc_client_new (
             "mongodb://localhost:27017/"  // 接続先URI
         );
  if( NULL == conn ){
    // error
    exit(-1);
  }
  // データ取得
  coll = mongoc_client_get_collection (
           conn   ,    // コネクション
           "db_test" , // DB名
           "cl_test"   // コレクション名
         );
  if( NULL == coll ){
    // error
    mongoc_client_destroy ( conn );
    exit(-1);
  }
  bson_init (&query);
  cusr = mongoc_collection_find (
           coll              , // コレクション
           MONGOC_QUERY_NONE , // mongoc_query_flags_t(検索条件なしを指定)
           0                 , // 開始位置(最初から取得)
           0                 , // 最大取得数(全て取得)
           0                 , // batchサイズ( default指定(=100) )
           &query            , // クエリ(指定なし)
           NULL              , // フィールド(全てを対象)
           NULL                // 取得クラスタ(default指定(=プライマリから取得))
         );
  if( NULL == cusr ){
    // error
    mongoc_client_destroy ( conn );
    bson_destroy (&query);
    exit(-1);
  }
  while (mongoc_cursor_next ( cusr , &doc ) ) {
    ret_str = bson_as_json ( doc , NULL );
    printf ( "%s\n", ret_str );
    bson_free ( ret_str );
  }
  // 後片づけ
  mongoc_collection_destroy( coll );
  mongoc_client_destroy ( conn );
  bson_destroy (&query);
  return 0;
}

docはfree漏れしているかも知れないが、後片づけ用の関数を見つけられなかった。
サンプルコード見ると放置してるからいいのかもね。

コンパイル、実行

そのままではライブラリを見つける事が出来なかったから
mongo.confを作成して登録してから実行している。

/etc/ld.so.conf.d/mongo.conf
/usr/local/lib
ldconfig # 設定反映
gcc -Wall -o mongo mongo.c -lmongoc-1.0 -lbson-1.0 -L/usr/local/lib -I/usr/local/include/libmongoc-1.0/ -I/usr/local/include/libbson-1.0/
./mongo
{ "_id" : { "$oid" : "54bfc04676613f50e453d617" }, "id" : 1.000000, "name" : "aaa" }
{ "_id" : { "$oid" : "54bfc04676613f50e453d618" }, "id" : 2.000000, "name" : "bbb" }
{ "_id" : { "$oid" : "54bfc04976613f50e453d619" }, "id" : 3.000000, "name" : "ccc" }

JSONを解析しないとそのままでは使いもんにならんね。