MongoDB の GUI CRUD ツール Compass を使ってみた（...ら MongoDB の凄さに驚いた件）

## 概要
MongoDB の公式で用意されている GUI CRUD ツール「MongoDB Compass（コンパス）」を導入・使用した時の備忘録。
MariaDB（MySQL）で言うところの Workbench（ワークベンチ）みたいなやつ。

・・・で、興味本位の備忘録のつもりが「MongoDB すごいじゃん！」ってなった感動も併せてチョイチョイ記す。

### 前提
ローカルマシン： MacBook Pro (Retina, 15-inch, Mid 2015)
OS： macOS Mojave (v10.14.2)

また、MongoDB が構築済みであること

### 前知識

MySQL 等の RDB の概念しかわからない方は、MongoDB の概念で混乱しがちです。
以下の表でキーワードの理解をマッピングしてください。
厳密には同じでは無いので、あくまでもイメージし易くする参考までに。

|MongoDB での概念|RDB での概念|
|:--|:--|
|データベース|データベース|
|コレクション|テーブル|
|ドキュメント|行/レコード|
|フィールド|列|

## 導入

### ツールダウンロード

「[MongoDB 公式サイトのダウンロードページ](https://www.mongodb.com/products/compass)」からダウンロードする。
※ 無料だが、メールアドレスなど登録作業が多少必要になる。

<img width="1552" alt="スクリーンショット 2019-02-03 21.05.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/31420f0b-ceb1-c6ff-a1d5-6e61d3909152.png">

<img width="1552" alt="スクリーンショット 2019-02-03 21.22.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/07ca94df-bac5-01ab-2ff1-f7e2dbe7f07d.png">

### インストール

ダウンロードしたやつをインストールする。ダブルクリックするだけ。

<img width="863" alt="スクリーンショット 2019-02-03 21.25.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/f511c567-e6f0-f917-ac7e-13bd9443a4d7.png">

Mac の場合はアプリフォルダに移動するとインストール完了

<img width="752" alt="スクリーンショット 2019-02-03 21.27.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/50f5a4b9-4a01-6506-7457-a936a9cb9e6b.png">

### 初回起動

初回起動時だけなんか色々聞かれます。

- Enable Product Feedback Tool（フィードバック送信を許可するか）
- Enable Geographic Visualizations（サードパーティ製品の地図化サービス連携を許可するか）
- Enable Crash Reports（クラッシュレポート送信を許可するか）
- Enable Usage Statistics（ツール利用の匿名の使用統計データ送信を許可するか）
- Enable Automatic Updates（自動アップデート機能を許可するか）

チェック入れるかは任意です。（ちなみに今回は、「Enable Product Feedback Tool」「Enable Crash Reports」「Enable Usage Statistics」を外しました）

<img width="1392" alt="スクリーンショット 2019-02-03 21.38.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/59bfb716-bd0b-d5ee-3db4-06bd5255fb0b.png">

・・・ってか、Geographic 連携できるんすね。ちょっと驚きました。

## 使い方

### 接続設定

接続設定が未設定の場合は下図の通り。・・・って、画面、カッコいいな、おい。
ユーザインターフェースが、従来の RDB の GUI ツールと比べるとだいぶシャレオツ。
ただ、日本語化設定は無い。残念。（2019年2月現在）

<img width="1392" alt="スクリーンショット 2019-02-03 21.48.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/95a62c39-6862-88ad-d4a5-e0b6f3cf10ed.png">

|設定項目|内容|
|:--|:--|
|Hostname|MongoDB 起動ホスト名。今回は localhost で行う|
|Port|MongoDB 起動ポート番号。今回はデフォルトの 27017|
|SRV Record|ドメイン情報の特殊な設定。今回は無効のまま|
|Authentication|MongoDB の認証設定を行なっていない場合は None でよい。今回はユーザ認証してるので「Username/Password」を選択。|
|Username|DB 接続時のユーザID|
|Password|DB 接続時のユーザパスワード|
|Authentication Darabase|認証設定選択時のみ表示される項目。標準的な構築なら「admin」にユーザ作ってるはず|
|Replica Set Name|レプリケーションの設定項目（※ 詳細は後述）。今回は不要|
|Read Preference|こちらもレプリケーションの設定項目。今回不要|
|SSL|ホストとのSSL通信設定。今回はローカルなので None|
|SSH Tunnel|こちらも None|
|Favorite Name|画面左ナビゲーションの「Favorites」欄に表示される任意の設定名称。日本語も使えます。未設定の場合は「Favorites」に表示されず、「RECENTS」の接続履歴にのみ表示される|

### 接続後ホーム画面

接続が成功するとこんな画面になる。・・・うーむ、やはりシャレオツですね。。。
ホスト内の DB 一覧が表示される。
ログインユーザの権限に基づいて DB 表示制御・操作制御がなされる。
今回は、事前に「sample」という DB を作成してある。

ログイン後の他の画面に遷移しても、左上のホームアイコンをクリックでこの画面に戻ってこれる。

<img width="1392" alt="スクリーンショット 2019-02-03 22.33.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/b1d9cae6-43ad-de99-a51a-dc103949d2e7.png">

DBを切断して、新規接続を作成したい場合は、メニューの Disconnect で切断すると戻れる。(下図は、Mac の場合)

<img width="501" alt="スクリーンショット 2019-02-03 23.47.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/69d488e6-85bc-daf8-8f41-2a282eb9be0e.png">

### DB 新規作成

ホーム画面の「CREATE DATABASE」ボタンを押下すると以下のようになる。
DB 名とコレクション名を入れて、モーダルの「CREATE DATABASE」を押すだけ。

<img width="1392" alt="スクリーンショット 2019-02-03 23.53.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/18f9ff44-7a1b-4dbd-4906-1275c716fe8c.png">


#### DB　作成時の「Invalid namespace specified 'DB 名.'」エラー

これは、最低１つのコレクションを DB 生成と同時に作る必要があり、DB 名だけ入力して CREATE しようとすると「Invalid namespace specified 'DB 名.'」というエラーが表示される。
ややこしいことに、意訳すると「指定された DB 名称は不正です」的な旨のエラー内容だが、実際は DB 名称ではなく、コレクションも指定しないために発生している。とりあえず、罠があるので注意。

<img width="1392" alt="スクリーンショット 2019-02-04 0.02.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/44b74b1b-7a14-a592-c742-ac1fb467217a.png">

上図の状態で、コレクション名だけ追記すると DB 作成に成功する。

### DB 削除

削除する際は、ホーム画面の DB 一覧でゴミ箱マークをクリックすると下図のようになる。
その状態で、誤削除防止の DB 名入力作業をしてから、DROP ボタンを押すと DB が削除される。

<img width="1392" alt="スクリーンショット 2019-02-04 0.11.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/938b9987-6891-75e9-b4be-806219600e13.png">

### コレクション操作

DB 一覧から DB を選択、または左ナビゲーションからアコーディオンを開いて中のコレクションをクリックすると、コレクション画面に遷移する。「リスト表示」と「テーブル表示」の２種類の表示方式がある。

リスト表示の場合

<img width="1392" alt="スクリーンショット 2019-02-04 0.14.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/18dad7b7-5fab-7ba8-10c6-d58b73e58f5c.png">

テーブル表示の場合

<img width="1392" alt="スクリーンショット 2019-02-04 0.16.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/199602/dc9e1182-e816-b4f5-f08d-b9466cefeb45.png">

### 検索

コレクションを選んだ時点で一覧表示がされるため、上部の「FILTER」に絞り込み条件を入れて「FIND」を押すだけ。
書き方は、`{フィールド名: 検索値}`と入力する。（詳細は公式などを見てください）

### 新規ドキュメント作成（INSERT）

「INSERT DOCUMENT」ボタンを押下して、立ち上がったモーダルダイアログの中で新規データのフィールドの値を入力するだけ。
`_id` は、標準的に作成したドキュメントであれば、勝手に ObjectId が自動付与される。

### ドキュメントの更新

一覧の各ドキュメントの右側に、鉛筆マークが出てるので、それ触って中身変えるだけ。
もしくは、一覧のデータでいじりたいところをダイレクトにダブルクリックして変更するだけ。

### ドキュメントの削除

一覧の各ドキュメントの右側のゴミ箱から削除できる

## おまけ：補足事項

### Replica Set とは

Replica Set (レプリカセット) とは、MongoDB が標準で備える強力なレプリケーションと自動フェイルオーバーの仕組み。

MongoDB は、複数サーバにDBをレプリケーション設定し、特定のマシンに何かあっても、他のマシンでデータの損失を回避する冗長構成を簡単に組むことができるフェイルオーバーの仕組みを標準で搭載している。

さらに、MongoDB には強力なシャーディング (水平分割) 機能も標準搭載されており、データを複数サーバに分散することができるが、
このシャーディングにおいて、複数台のMongoDBサーバーで構築された Replica Set をシャードとして追加することが可能。

これらによって、大規模で高可用なデータベースをシンプルに構築することができ、これらを標準機能として持っていることは MongoDB の大きな強みであるとのこと。

詳細は、公式のドキュメントを参照のこと。
[Replication Introduction - MongoDB Manual 3.0](https://docs.mongodb.com/v3.0/core/replication-introduction/)

とりあえず、MongoDB 思ってたよりすごいぞ！・・・と言うことに、GUI ツールの設定を触ってて初めて気づいた。