MongoDB コマンド チートシート

## DB 権限まわり

##### ログイン
MongoDB の認証機能を有効にしていた場合
`mongo` で入った後に、以下のコマンド

```bash
use admin # DB 選択
db.auth("user_name", "password") # 認証
```

もしくは、`mongo` で入る際に以下でログイン

```bash
mongo DB名 -u ユーザ名 -p パスワード
```

##### ユーザ操作

- 基本的に、対象となる DB を `use データベース名` で選んでから行う
- ユーザ作成前に、事前に DB を作成しておくこと

```bash
# ユーザ一覧 確認
db.getUsers()

# 全 DB の管理者権限 (CRUD 含む) をもつユーザ 作成
db.createUser({user:"user_name", pwd:"password", roles:[{role:"userAdminAnyDatabase", db:"admin"}]})

# 特定の DB の管理者権限をもつユーザ 作成
db.createUser({user:"user_name", pwd:"password", roles:[{role:"dbOwner", db:"db_name"}]})

# 特定の DB の一般ユーザ 作成
db.createUser({user:"user_name", pwd:"password", roles:[{role:"read", db:"db_name"}]})
db.createUser({user:"user_name", pwd:"password", roles:[{role:"readWrite", db:"db_name"}]})

# パスワード変更
db.changeUserPasword("user_name", "new_password")

# ユーザにロールを追加 (例： 読み取り権限 付与)
db.grantRolesToUser("user_name", [{role:"read", db:"db_name"}])

# ユーザのロールを削除 (例： 読み取り権限 剥奪)
db.revokeRolesFromUser("user_name", [{role:"read", db:"db_name"}])

# ユーザ削除
db.dropUser("user_name")
```


## CRUD 操作： DB

- 基本的に、対象となる DB を `use データベース名` で選んでから行う

```
# DB 一覧
show dbs

# 使用 DB 切り替え
use データベース名

# 現在選択している DB 確認
db.stats()

# DB 作成 (実際は 1 件でもコレクションを作成しないと表示されない)
use データベース名

# DB 削除 (use で選択されているものが削除される)
db.dropDatabase()

```

## CRUD 操作： コレクション

- 基本的に、対象となる DB を `use データベース名` で選んでから行う

```bash
# コレクション 一覧
show collections

# コレクション 作成
db.createCollection('collection_name')

# コレクション 削除
db.コレクション名.drop()

```


## CRUD 操作： ドキュメント

- 基本的に、対象となる DB を `use データベース名` で選んでから行う

```bash
# ドキュメント 一覧 (全件 検索)
db.コレクション名.find()

# ドキュメント 一覧 (CLI でも見やすく整形してくれるオプション)
db.コレクション名.find().pretty()

# ドキュメント 検索 (AND 条件)
db.コレクション名.find({column1: 'aaa', column2: 10})

# ドキュメント 検索 (OR 条件検索)
db.コレクション名.find({column_name1: 'aaa'}, {column_name2: 10})

# ドキュメント 検索 (否定 条件検索 (index に注意))
db.コレクション名.find({column_name: {$ne: 'aaa'}})

# ドキュメント 検索 (「xxx より大きい」 条件検索)
db.コレクション名.find({column_name: {$gt: 10}})

# ドキュメント 検索 (「xxx 以上」 条件検索)
db.コレクション名.find({column_name: {$gte: 10}})

# ドキュメント 検索 (「xxx 未満」 条件検索)
db.コレクション名.find({column_name: {$lt: 10}})

# ドキュメント 検索 (「xxx 以下」 条件検索)
db.コレクション名.find({column_name: {$lte: 10}})

# ドキュメント 検索 (正規表現で検索)
db.コレクション名.find({column_name: /^aaa/})

# ドキュメント ソート (昇順 検索)
db.コレクション名.find().sort({column_name: 1})

# ドキュメント ソート (降順 検索)
db.コレクション名.find().sort({column_name: -1})

# ドキュメント 件数
db.コレクション名.count()

# ドキュメント 検索 (件数指定)
db.コレクション名.limit(20)

# ドキュメント 作成 (コレクション が万が一無くても自動で同時に生成される)
db.コレクション名.insert({new_column1: 'new_value', new_column2: 999})

# ドキュメント 作成 (Date 型で作成する場合)
db.コレクション名.insert({date_column: ISODate("2019-03-03T09:00:00+09:00")})

# ドキュメント 更新 (第 １ 引数が更新条件、 第 ２ 引数が更新内容)
db.コレクション名.update({column_name: 'aaa'}, {$set: {column_name: 'bbb'}})

# ドキュメント 削除
db.コレクション名.remove({column_name: 'aa'})
```


## CRUD 操作： インデックス系

- 基本的に、対象となる DB を `use データベース名` で選んでから行う

```bash
# インデックス作成 (インデックス貼るだけ)
db.コレクション名.ensureIndex({column_name: 1})

# インデックス作成 （インデックスに名前をつける）
db.コレクション名.ensureIndex({column_name: 1}, {name: 'index name'})

# インデックス削除
db.コレクション名.dropIndex('index name')

# ユニーク (一意) 制約
# sparse: true にしないと 「null」 もユニークの制約対象になってしまう
db.コレクション名.ensureIndex({column: 1}, {unique: true, sparse: true})
```

## ユーザのロール

用意されている主なロール。詳細は、公式の「[Built-In Roles](https://docs.mongodb.com/manual/reference/built-in-roles/)」を参照。

|種別|ロール|権限内容|
|:--|:--|:--|
|Database User Roles|read|システム系のDBやコレクション以外のデータを読む権限|
||readWrite|システム系のDBやコレクション以外のデータを読み書きする権限|
|Database Administration Roles|dbAdmin|データベースの管理権限|
||dbOwner|システム全体の管理権限。readWrite、dbAdmin、userAdminロールと関連付いている|
||userAdmin|ユーザやロールの管理者|
|Cluster Administration Roles|clusterAdmin|クラスタの管理権限。clusterManager、clusterMonitor、hostManagerロールと紐付く|
||clusterManager|クラスタの運用管理権限|
||clusterMonitor|クラスタのモニタリングツールに対する参照権限|
||hostManager|サーバの運用管理権限|
|Backup and Restore Roles|backup|データのバックアップ権限|
||restore|バックアップデータからのリストア権限|
|ALL-Database Roles|readAnyDatabase|全てのDBの読み取り権限|
||readWriteAnyDatabase|全てのDBの読み書き権限|
||userAdminAnyDatabase|全てのDBのユーザ管理権限|
||dbAdminAnyDatabase|全てのDBのデータベース管理権限。dbAdminと同等|
|Superuser Roles|root|システム全体の管理権限。readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin roles、restore、backupが紐付く|
|Internal Role|__system|内部処理用の権限。割り当ててはいけない|