AWSDataBaseJavaScriptLinuxMongoDBnode.jsサーバー構築プログラム

サーバー構築4 MongoDB導入

データーベースの作成

データベースとしてMongoDBを今回は使用します。

NoSQLに分類されるデータベースでSQL文を使わなくてよく、高速でJSONのデータ構造とほぼ同じ。

公式リファレンス

EC2でインスタンスを作成し、MongoDBを導入してVPCでプライベート接続してデータを利用する。

mongoDBのインスタンスにしているEC2はリブートするとデータが消えるので、mongoDBを設定完了時に、AMI(イメージ)を作成し、S3にバックアップ等リブート後もそのイメージから再生やデータのリカバリーができるようにしておくこと。

1.MongoDBをインストール。

Windowsはここからダウンロードしてインストール。

C:\Program Files\MongoDB\Server\バージョン\bin

にpathを設定。

CentOS/RHEL7にインストールする場合。

レポジトリファイルを作成

sudo 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
そしてインストール
sudo yum install -y mongodb-org
mongoDBのインスタンスのセキュリティーグループでインバウンドの編集をクリックしてカスタムTCPを追加。ポートは27017、ソースは0.0.0.0/0。
これは起動確認したらアプリケーションインスタンスからのIPアドレスに限定するなどして、セキュリティー対策をしておくこと。
ファイアウォールの設定が必要な場合はしておく。
sudo firewall-cmd --add-port 27017/tcp --permanent
sudo firewall-cmd --reload
firewallの確認
sudo firewall-cmd --list-all
そして以下をコマンド入力。
sudo vi /etc/mongod.conf
MongoDBの設定ファイルを編集してbind_ipの前に#をつけてコメントアウト。ローカルホスト以外からのアクセスを受け付けるように設定。
sudo service mongod start
でサービスを開始する。
セキュリティー対策としてdefaultのportは使用を避けるべきなので、本番環境では
sudo firewall-cmd --remove-port 27017/tcp --permanent
sudo firewall-cmd --reload
でポートを閉じます。
新たにmongoDB用にportを開きます。
sudo firewall-cmd  --add-port ポート番号/tco --permanent
sudo firewall-cmd  --reload
mongoDBのconfigファイルを書き換える
sudo vi /etc/mongod.conf
net:
      port: ポート番号 #開けたポート番号に書き換える
SELinuxの設定
SELinuxがOnになっている場合はポート番号を変更するため以下のコマンドを実行
sudo semanage port -a -t mongod_port_t -p tcp 変更後のポート番号
そしてmongoを再起動
sudo service mongod restart

Permissionで動かない等は、

$ sudo chown -R mongod:mongod /var/lib/mongo

とmongoフォルダにはmongodでアクセスするので所有権を変更したり、permissionを変更したり、

sudo cat /var/log/mongodb/mongod.log

でログファイルを確認して原因を探って下さい。

 

ポート変更後はmongoシェルでポート番号を指定してアクセスする必要がある。

例えば以下のようにコマンド入力してDBにアクセスします

mongo --port ポート番号
mongo localhost:ポート番号/admin

2.データベース用ディレクトリの作成

ホームディレクトリ以下にMongoDBが利用するデータ保存用ホルダーを作成する。

mkdir db

このディレクトリ内は基本触らないようにする。

mongod --dbpath db

で起動。mongodbが停止して、再起動できないときはMongoDBインスタンスを再起動する。

それでもできないときは、/var/lib/mongo/mongod.lockを削除して、上記コマンドに–repairをつけ入力。MongoDBインスタンスを再起動。

3.MongoDBの操作

MongoDBのプロセスが動いている状態で

mongo --port ポート番号

をコマンドプロンプトに入力。

起動に成功してコマンドの入力待ちの状態になりました。

4.MongoDBの基本

データベース、コレクション、ドキュメントという階層構造になっています。スキーマが不要で、データ構成の変化に柔軟に対応できる。コレクションのメソッドを使用してCRUD操作します。MongoDBは変数や制御構造、カーソルが使用できます。

例としてサイトのアカウントのユーザー情報を構造的にみると

データベース名:データベース

ユーザー情報:コレクション

ユーザーの個人情報:ドキュメント

となり、ユーザー情報は1人以上のユーザーで構成され、その集まりがアカウント全体のデータベースとなります。各自のメールアドレス、年齢などはドキュメントになります。

5.Mongoのクエリ

データベース操作

データベース作成

>use データベース名

データベース参照

>show dbs

データベース削除

>use データベース名
>db.dropDatabase()
コレクション操作

コレクション(テーブル)作成

自動生成、もしくは

>db.createCollection("作成するコレクション")

コレクション(テーブル)変更

自動生成

コレクション(テーブル)名参照

>show collections

コレクション(テーブル)のデータ削除 (コレクションは残ります)

>db.データ削除するコレクション名.remove({})

コレクション(テーブル)削除 (コレクションごと中のデータも削除

>db.削除するコレクション.drop()
ドキュメント操作

挿入

>db.コレクション名.insert({})

データ取得

>db.コレクション名.find()

条件付きで取得

# categoryというフィールドにAを持っている
>db.コレクション名.find({"category": "A"})

# ageが30以下のデータを取得 $lte: less than or equal (~以下)
>db.コレクション名.find({"age" :{$lte :30}})

# categoryというフィールドにAを持っている、かつageが30以下 $and: (かつ)
>db.コレクション名.find({$and: [{"category": "A"}, {"age": {$lte: 30}}]})

# categoryというフィールドにAかCを持っている $or: (もしくは)
>db.コレクション名.find({$or: [{"category": "A"}, {"category": "C"}]})

# emailがinfo@example.com以外のデータを取得 $ne: not equal (等しくない)
>db.コレクション名.find({"email": {$ne :"info@example.com"}})

# ageが10,20,30,40のいずれかを持っている $in: 逆の条件は$nin
>db.コレクション名.find({"age": {$in: [10, 20, 30, 40]}})

その他の比較演算子

名称 書式 意味
未満(age < 20) $lt less than
超過(age > 20) $gt greater than
以上(age >= 20) $gte greater than or equal
等しい(age == 20) $eq equal

最初にヒットしたデータの取得

>db.コレクション名.findOne({検索条件})

重複なしで検索

>db.コレクション名.distinct("検索条件")

重複なし検索の件数

>db.コレクション名.distinct("検索条件").length

並び替え

# nameを昇順、ageを降順に並び替え
>db.コレクション名.find().sort({ name : 1, age: -1})

件数表示

>db.コレクション名.count()

指定件数表示

>db.コレクション名.find().limit(件数)

 

更新

>db.コレクション名.uodate(condition, operation, upsert, multi)

operation: $inc/$set/$push/$popなどがある。

データを追加 $set

>db.コレクション名.update({検索フィールド: "検索する値"}, {$set: {データを追加するフィールド: "追加する値"}})

 

upsert: true時にconditionに一致するデータが無い時は新たにデータが登録される。

multi: trueの時に、conditionに一致したすべてのデータを書き換える。

 

コメントを残す