はらこメモ

プログラミングに関して調べたことについてのメモ書きです。言語はバラバラ…。

MongoDBについてメモ

・MongoDBはNoSQL(Not SQL)に分類されるデータベースの一つ。
・データをキーと値の組合せで記録する。
・BSON(Binary JSON)形式でデータを保存する。
例えば、

{name:"aaa",age:26,mail:["xxxx@aaa.com","yyy@xxx.jp","zzz@yyy.net"]}

スキーマレス
MySQL等のRDBでいうCREATE TABLEが必要ない。
同じコレクション(RDBでいうとテーブル)に異なる構造のBSONを保存できる。

トランザクション、表の結合はできない。

MongoDBをCentOS(64bit)にインストールしてみた。

YUMリポジトリが提供されているので、
下記に設定ファイルを新規に作成して登録する。

/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

yumコマンドでMongoDBをインストール

yum install mongo-10gen mongo-10gen-server

インストールが終わったらMongoDBサーバを実行する。

/etc/init.d/mongod start

次から自働的に起動するように設定する。

chkconfig --add mongod
chkconfig mongod on

参考:http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/

使ってみる。

$ mongo
MongoDB shell version: 2.4.8
connecting to: test

#データベースの切り替え
>use memodb
switched to db memodb

#コレクションにデータの保存(userというコレクションにデータを保存する)
db.user.save({name:"aaa",age:26,
mail:["xxxx@aaa.com","yyy@xxx.jp","zzz@yyy.net"]});

#コレクションから検索
> db.user.find({name:"aaa"});
{ "_id" : ObjectId("5295f9fd14dc5c7c99bf9817"), "name" : "aaa", "age" : 26, 
"mail" : [  "xxxx@aaa.com",  "yyy@xxx.jp",  "zzz@yyy.net" ] }

> db.user.find({mail:"yyy@xxx.jp"});
{ "_id" : ObjectId("5295f9fd14dc5c7c99bf9817"), "name" : "aaa", "age" : 26, 
"mail" : [  "xxxx@aaa.com",  "yyy@xxx.jp",  "zzz@yyy.net" ] }
※配列のデータをキーにしても検索できた。

#コレクションからデータの削除
> db.user.remove({name:"aaa"})

PHPから利用できるようにしてみる。
PECLのmongoをインストールする。

pecl install mongo

gcc等がインストールされていないとエラーになる。

php.iniに下記を追加

extension=mongo.so

httpdの再起動をしてphpinfo()にmongoが表示されていればOKなのかな。

PHPからMongoDBを使ってみる。

<?php
  $mongo = new Mongo("localhost:27017");

  //DBの選択
  $db = $mongo->selectDB("memodb");

  //コレクションの選択
  $collection = $db->selectCollection("user");

  //コレクションにデータの保存
  $collection->insert(array("name"=>"aaa","age"=>26,
    "mail"=>array("xxxx@aaa.com","yyy@xxx.jp","zzz@yyy.net")));

  //コレクションからデータの検索
  $cursor = $collection->find(array("name"=>"aaa"));

  //検索結果を表示
  foreach($cursor as $cur){
    print_r($cur);
  }

  //コレクションからデータを削除
  $collection->remove(array("name"=>"aaa"));
?>

・実行結果

Array ( [_id] => MongoId Object ( [$id] => 529607a77f8b9aea1417e1b3 )  
[name] => aaa [age] => 26 
[mail] => Array ( [0] => xxxx@aaa.com [1] => yyy@xxx.jp [2] => zzz@yyy.net ) ) 

PHPでPermission deniedのエラーが発生した場合は下記を実行する。
 参考:http://php.net/manual/ja/class.mongoconnectionexception.php

$ /usr/sbin/setsebool -P httpd_can_network_connect 1
$ /etc/init.d/httpd restart