MongoDB導入

# 参考URL

公式
https://www.mongodb.com/

ドキュメント
https://docs.mongodb.com/manual/introduction/

CentOS7 に MongoDB を導入する方法
https://qiita.com/tomy0610/items/f540150ac8acaa47ff66

【MongoDB】認証の設定をする
https://it-blue-collar-dairy.com/add_auth_to_mongodb/

いいからやる。CentOS7 + PHP7 + mongoDB
https://qiita.com/ayayan-z/items/0e8157f6a7cdb5842105

やってみようNoSQL　MongoDBを最速で理解する
https://qiita.com/Brutus/items/8a67a4db0fdc5a33d549

# インストール

```
vi /etc/yum.repos.d/mongodb-org-4.0.repo

[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
```

```
yum install mongodb-org

mongod -version

systemctl start mongod
```

デフォルトの起動ポートは 27017 番

# 管理ユーザ作成

デフォルトでは、MongoDBにはユーザが必要ない。つまり認証が無い。
設定で有効にする。

```
# MongoDBに入る
mongo

# adminデータベースに接続する。adminデータベースはインストール時に作成されている。
> use admin

# 管理ユーザを登録
> db.createUser({user:"admin", pwd:"パスワード", roles:[{role:"root", db:"admin"}]})

# ユーザの存在確認
> db.getUsers()

# もしくは以下でもユーザ確認できる (パスワードはハッシュ化されているので文字列になっている)
> db.system.users.find()
```

# 権限

https://docs.mongodb.com/manual/reference/built-in-roles/
いろいろある

# 認証有効化

```
vi /etc/mongod.conf

security:
  authorization: enabled
```
```
systemctl restart mongod

* この際に起動に失敗する場合がある。その場合は、
less /var/log/mongodb/mongod.log

Failed to unlink socket file /tmp/mongodb-27017.sock Operation not permitted
とあるので、
rm /tmp/mongodb-27017.sock
でOK
```

# 認証確認

```
mongo

> use admin
> db.getUsers()
2019-08-08T18:01:03.291+0900 E QUERY    [js] Error: command usersInfo requires authentication :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.getUsers@src/mongo/shell/db.js:1763:1
@(shell):1:1

# ログイン
> db.auth("admin", "パスワード")
1
> db.getUsers()
表示される
```

# ユーザ作成

```
mongo

# 管理者でログイン
> use admin
> db.auth("admin", "パスワード")

# 先にどのデータベースを使用するか指定する
# useと言いながらcreateも兼ねている感じ
> use test_database
> db.createUser({user:"test_user", pwd:"test_user", roles:[{role:"readWrite", db:"test_database"}]})
> db.getUsers()
[
	{
		"_id" : "test_database.test_user",
		"userId" : UUID("75db633e-20b3-41b9-9f38-f2c2374d264b"),
		"user" : "test_user",
		"db" : "test_database",
		"roles" : [
			{
				"role" : "readWrite",
				"db" : "test_database"
			}
		],
		"mechanisms" : [
			"SCRAM-SHA-1",
			"SCRAM-SHA-256"
		]
	}
]
```

# データベース操作

```
mongo

> use test_database
> db.auth("test_user", "test_user")

# コレクション（テーブルのこと）作成
> db.createCollection('test');

# コレクションにドキュメント（データのこと）を追加する
> db.test.insert( { name:'tanaka', address:'tokyo' } );

# 確認
> show dbs
> show collections
> db.test.find();
```

# PHPからmongoDBを使えるようにする

```
yum --enablerepo=epel,remi,remi-php71 install php71-php-pecl-mongodb

vi /etc/php.ini

# 最下段にでも追加
extension=/opt/remi/php71/root/usr/lib64/php/modules/mongodb.so

systemctl restart httpd
# php-fpmの場合
systemctl restart php-fpm
```

phpinfo()にmongodbの情報が表示されていればOK

```
php -i | grep mongo
```

# サンプルプログラムで動作確認

```
<?php
// DB接続　認証＋データベース指定
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017/test_database", ['username' => 'test_user', 'password' => $pass]);

// Insert
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['name' => '山田', 'address' => '東京']);
$manager->executeBulkWrite('test_database.test', $bulk);

// Select
//$filter = ['address' => ['$gt' => 'tokyo']]; // where句
$filter = [];
$options = [
  'projection' => ['_id' => 0],
  'sort' => ['_id' => -1],
];
$query = new MongoDB\Driver\Query($filter, $options);
$cursor = $manager->executeQuery('test_database.test', $query);

// Select 結果表示
foreach ($cursor as $document) {
  var_dump($document);
}
```

動けばOK