Help us understand the problem. What is going on with this article?

CでMongoDBにアクセスする

More than 1 year has passed since last update.

概要

MongoDB公式から出ているCのドライバを使って
MongoDBにアクセスするサンプルを作りましたので、そのソースと手順などを共有したいと思います。

環境構築

CentOSを想定しています。

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

/etc/yum.repos.d/mongodb.repo
[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
centos7
yum update -y
yum install -y mongodb-org  # mongodbインストール
# mongodbドライバインストール
yum install -y make git gcc automake autoconf libtool pkg-config openssl-devel cyrus-sasl-devel wget tar  # driverインストールに必要なもの

wget https://github.com/mongodb/mongo-c-driver/releases/download/1.9.5/mongo-c-driver-1.9.5.tar.gz
tar xzf mongo-c-driver-1.9.5.tar.gz 
cd mongo-c-driver-1.9.5
./configure
sudo make
sudo make install

データベースの設定

テスト用のデータを入れていきます。

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

MongoDBへアクセス

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;
}

コンパイル、実行

そのままではライブラリを見つける事が出来ませんのでしたので
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" }

CでJSONを解析しないといけないのがしんどそうですね。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away