これまでSQLを使ってアプリケーションの作成をしてきました
ということで(どういうこと)、今回はMongoDBを使用してみたいと思います
MongoDBとは
データベース(DB)にはいくつか種類があります
代表的なものを見てみると
DBの種類
SQL
- リレーショナルデータベース
NoSQL
- キーバリュー型データベース
- 列指向データベース
- ドキュメント指向データベース
こんな感じでしょうか
個人的になじみが深いのはリレーショナルデータベースはいわゆるSQLデータベースです
MongoDBはドキュメント指向DBのひとつになります
ドキュメント指向DBとリレーショナルDBの違い
ドキュメント指向DBの説明をする前に
リレーショナルデータベースはちょうどスプレッドシートやExcelのような表のイメージですので扱いやすいというイメージがありますね
id | name | age | gender |
1 | taro | 40 | male |
2 | hanako | 25 | female |
… | … | … | … |
こんな感じです。
カラム(列)でデータの種類を定義して、それに分類されるデータを行に格納していくかたちです
そして、この全体をテーブルといいます
また、テーブルがあつまったもの全体がデータベースです
見慣れているせいもあると思いますが、データベースとしてはまとまっていて見やすいという印象です
集計や検索もしやすいですね
しかし、リレーショナルデータベースは、レコード(行)ごとでカラムを変えるということができません
よって、単一テーブルでデータをまとめるときは、同一カラムのデータに制限されます
そこで複数のテーブルを結合して処理を施します
とうぜんデータベースの構造が複雑になればなるほど処理も複雑になり、処理にかかる時間も長くなります
一方MongoDBのようなドキュメント指向型のデータベースは、データに型を持ちません
一つずつのデータをドキュメントで保持します
リレーショナルデータベースのようにデータごとに同じカラムを持つ必要がないのです
ではMongoDBのドキュメント指向型のDBはどのような構造のDBなのでしょうか
公式のマニュアルにはこのように書かれています
A record in MongoDB is a document, which is a data structure composed of field and value pairs. MongoDB documents are similar to JSON objects. The values of fields may include other documents, arrays, and arrays of documents.
https://docs.mongodb.com/manual/introduction/
- MongoDBにおけるレコードはドキュメントである
- ドキュメントはフィールドとバリューのペアで構成されるデータ構造である
- MongoDBのドキュメントはJSONに似ている
- フィールドのバリューは他のドキュメントや配列やドキュメントの配列を含んでもよい
一つずつ確認すると
1はいわゆる言葉の置き替えです
「リレーショナルデータベースでいうレコード(行)はドキュメントと言う」
という意味です
2と3は実際にデータの例を見てみるとわかりやすいです
先ほどのリレーショナルデータベースの例をMongoDBのドキュメントで書き換えると
{
name: “taro”,
age: “40”,
gender: “male”
}
と、このように一つのドキュメントを(field:value)の集まりで表すことができます
そして、JSON形式のデータに似ています
実際にはBSON形式といって、それぞれのデータに型を定義することができます
※定義の仕方はまた別の機会に説明します
4は一つのfield:valueのvalueの中にさらにドキュメントや配列などをもつことができるということです
入れ子構造になるという感じです
たとえば
このようにすることができます
そしてこれら一つひとつをドキュメントといい、その集まりがコレクションです
リレーショナルデータベースが表ならば
ドキュメント指向のDBは
カードの束という感じでしょうか
上の例がUsersというコレクションとすれば、
ドキュメントは1枚のカードであり、カード1枚につき、一人ずつプロフィールなどのデータが書かれているという感じです
リレーショナルデータベースとドキュメント指向のDBの最も大きな違い
一番の違いは
リレーショナルデータベースの場合は同じテーブルについて、各レコードごとのカラムは共通です
先ほどの例でいうと一人分のデータが単一レコードとなります
そして、一人ずつのデータにはかならず
id番号と氏名と年齢と性別が含まれている必要があります
※データが含まれていない場合、含まれていないという判断がされます
途中から項目を増やす場合はテーブル全体の書き換えが必要になることが想定されます
しかし、ドキュメント指向のDBの場合、一つひとつのドキュメントがもつフィールドは
同一コレクション内であったとしても、統一されている必要はありません
例えば太郎さんのドキュメントには趣味の項目があるけれど、花子さんのドキュメントには趣味の項目がなくても問題はありません
MongoDBなどのドキュメント指向のDBはこのような特徴があります
※ただし、実際にはデータを扱いやすい情報にするためにスキーマを作ってドキュメントの構成を定義づける場合があります
あとは実際に使ってみてどのようなDBかを知ることが重要ですね
MongoDBのインストール ※Windows版です
ここから公式サイトへ
Softwareのタブから必要なサービスをダウンロードしてください
今回私は本番環境での仕様ではありませんのでCommunityServer(パッケージmsi)をダウンどーどしました
ライセンスを確認の上、インストールをしてください
※Macの場合はHomebrewを利用してインストールできます
$ brew update
$ brew install mongodb-community
初期設定をしましょう管理権限を持つユーザーを作成しよう
実は、MongoDBはインストールしただけの場合、ユーザー認証が行われません
誰でもアクセスできる状態になっています
そこで、最初に管理ユーザーを作成します ※公式サイトのドキュメントを参照
まずは環境変数のPATHにMongoDBのフォルダのパスを追加しましょう
左下のスタートの右側の検索窓に環境変数といれてシステムの環境変数を選択
環境変数をクリックして
PathにMongoDBのフォルダのアドレスを追記
※私の場合はC:\Program Files\MongoDB\Server\4.4\binでした
まだ認証機能はない状態ですが、いったんそのままDBのサービスをスタートします
コマンドプロンプトの管理者で立ち上げます
そして、
>mongod
(最後のdを忘れないようにしましょう)
とコマンドを打つとばーーーーーっと文字がでて起動します
そして、このまま別のコマンドプロンプトを開いて
>mongo
これでMongoDBのシェルが起動します
ユーザー管理をするためにadminというデータベースに切り替えます
※adminデータベースは最初から存在しています
>use admin
use データベース名
でデータベースを切り替えることができます
続いてすべてのDBの権限を持つユーザーを作成します
db.createUser(
https://docs.mongodb.com/manual/tutorial/enable-authentication/
{
user: “myUserAdmin”,
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: “userAdminAnyDatabase”, db: “admin” }, “readWriteAnyDatabase” ]
}
)
公式ドキュメントよりサンプルを引用しています
user: “任意のユーザー名”
pwd: “任意のパスワード”
パスワードは直接打ち込んでもいいですが、passwordPrompt()とすることで上のコマンド実行した際に、パスワードの入力を求められるので、そこでパスワードを入力してください
role:{ role: “権限”, db: “権限を与えるDB名”}
で権限を指定します
上の例の場合は2つの権限が与えられています
[ { role: “userAdminAnyDatabase”, db: “admin” }, “readWriteAnyDatabase” ]
ですので、前半部分がadminデータベース(ユーザー管理用データベース)に
“userAdminAnyDatabase”すべてのデータベースのユーザー管理の権限を与え
“readWriteAnyDatabase”ですべてのデータベースの読み書きの権限を与えています
ちなみに、認証制限をするためだけならば
{ role: “userAdminAnyDatabase”, db: “admin” }のみでよい
これで管理用のユーザーが作成できました
ただし、これだけではまだ認証によるアクセス制限はかかっていません
アクセス制限をかけて再起動しよう
サーバーをシャットダウンしましょう(起動しているコマンドプロンプトをクリックしてCTR+C)
mongod.cfgをメモ帳などでファイルを開いて
security:
authorization: enabled
を加えましょう #付きで書かれている場合はコメントアウトされています
#を外しましょう
これで設定完了です
あとはサーバーを再開しましょう
>mongod –dbpath “C:\Program Files\MongoDB\Server\4.4\data” –config “C:\Program Files/MongoDB/Server/4.4/bin/mongod.cfg”
で設定が反映されるはずです
以降は
>mongodでの起動で大丈夫です
別のコマンドプロンプトを開いて
>mongo -u ユーザー名(adminユーザー)
するとパスワードの入力を求められます
キーをたたいても文字はでませんが、気にせずパスワードを叩いてください
正しければ認証付きで起動するはずです
これでアクセス制限が完了しました
ということで、今回はここまで
コメント