MongoDBことはじめ

# MongoDB

[MongoDB：開発者向けデータプラットフォーム | MongoDB](https://www.mongodb.com/ja-jp): ドキュメント指向型のNoSQLデータベース管理システム。

MongoDBを使って、データベースを更新するために何が必要かをいくつか確認してみる。

# MongoDBのdockerコンテナの起動
Ubuntu22.04だと純正`apt`だと入らないようだったので、せっかくならと言うことでMongoDBのdockerコンテナで実行してみることにする。
`docker`のインストールは[Docker備忘録 #初心者 - Qiita](https://qiita.com/Yasushi-Shinohara/items/b24ae859717b8dcc330c#ubuntu)で済んでいる状態。

```bash
docker run -d \
  --name mongodb \
  -p 27017:27017 \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=secret \
  mongo
```
で最新版のMongoDBがdockerで走る。
確認のために`sudo docker ps`で
```console
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                                             NAMES
d25ac999e428   mongo     "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:27017->27017/tcp, [::]:27017->27017/tcp   mongodb
```
が表示され、走っていることが確認できる。

`docker exec -it mongodb mongosh -u admin -p secret`でコンテナに入ると
```
Current Mongosh Log ID:	67debf3155d7b2192b6b140a
Connecting to:		mongodb://<credentials>@127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.4.2
Using MongoDB:		8.0.5
Using Mongosh:		2.4.2

For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/


To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy).
You can opt-out by running the disableTelemetry() command.

------
   The server generated these startup warnings when booting
   2025-03-22T09:40:29.462+00:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
   2025-03-22T09:40:30.121+00:00: For customers running the current memory allocator, we suggest changing the contents of the following sysfsFile
   2025-03-22T09:40:30.121+00:00: For customers running the current memory allocator, we suggest changing the contents of the following sysfsFile
   2025-03-22T09:40:30.121+00:00: We suggest setting the contents of sysfsFile to 0.
   2025-03-22T09:40:30.121+00:00: vm.max_map_count is too low
   2025-03-22T09:40:30.121+00:00: We suggest setting swappiness to 0 or 1, as swapping can cause performance problems.
------

test> 
```
あるいは`sudo docker exec -it mongodb bash`で通常のコンソールで入った後`mongosh -u admin -p secret`で同様にコンテナ内で`mongosh`が起動する。

## 一般ユーザーの追加
`admin`で`mongosh`に入り、`use mydb`で、以下のようにdbにユーザーとパスワードを追加:
```js
mydb> use mydb  // ← 対象のデータベースに切り替え この時点でmydbは存在していなくても構わない
switched to db mydb
mydb> db.createUser({ // この時点でmydbにデータがなくても構わない
  user: "newuser",
  pwd: "yourpassword", //要変更
  roles: [{ role: "readWrite", db: "mydb" }]
})
{ ok: 1 }
mydb> 
```
`mongosh`からログアウト後に
```bash
mongosh -u newuser -p yourpassword --authenticationDatabase mydb
```
で、mydbが操作できるシェルに入れる。

```js
test> use mydb
switched to db mydb
mydb> show collections
                               //データが何もないのでブランク
mydb> show dbs
                               //データが何もないのでブランク
mydb> db.sample.insertOne({ name: "Alice", age: 30 }) //データを追加
{
  acknowledged: true,
  insertedId: ObjectId('67decdd70389095b266b140b')
}
mydb> db.sample.find()
[
  { _id: ObjectId('67decdd70389095b266b140b'), name: 'Alice', age: 30 }
]
mydb> show dbs
mydb  8.00 KiB
mydb> show collections
sample
mydb> db.sample.find().pretty()
[
  { _id: ObjectId('67decdd70389095b266b140b'), name: 'Alice', age: 30 }
]
mydb> db.sample.countDocuments()
1
mydb> db.sample.findOne()
{ _id: ObjectId('67decdd70389095b266b140b'), name: 'Alice', age: 30 }
```
MongoDBでは、RDBの「TABLE」に相当するものがと「collection」と呼ばれている。

# MongoDB CompassをリモートからMongoDBに繋げて操作する
MongoDBの公式GUIを[MongoDB Compass Download (GUI) | MongoDB](https://www.mongodb.com/try/download/compass)からダウンロードする。

手元のホスト(shinohara-mac(仮名))で、MongoDB Compassを起動。
左側のペインにあるCONECTIONSの右にある`＋`をクリックして、接続先の情報を記入する。
- Name: わかりやすい名前を適当に
- Advanced Connection Optionsをクリック
   + General 
     * Connection String Scheme: mongodb
     * Host: 192.168.xxx.yyy:27017
   + Authentfication
     * Username: newuser
     * Password: yourpassword(要変更)
     * Authentificationdatabase: mydb
あたりをデフォルトから変えて入力すればOKのはず。これで`Save&Connect`をクリックするとDBにアクセスできる。

# コマンドまとめ
mongoDBは基本的に、DB毎に何かしらの操作が可能なuserが付属している という建て付けのよう。なので、userの存在の前にDBが必要となる。

```js
use mydb // mydbに以下のuserを追加する
db.createUser({
  user: "myuser",
  pwd: "mypassword",
  roles: [
    { role: "readWrite", db: "mydb" }, //mydbには "readWrite"権限を
    { role: "read", db: "otherdb" } // otherdbには"read"権限を
  ]
})
```
## `role`の選択肢
DBレベルでの`role`(もっと広い範囲での権限に影響する`role`もあるらしい)
|ロール名	|説明|
|----|----|
|`read`	|読み取り専用。ドキュメントの検索のみ可能。|
|`readWrite`	|読み取り＋書き込みが可能（挿入、更新、削除など）。|
|`dbAdmin`	|インデックス作成、コレクションの情報取得などが可能。|
|`userAdmin`	|ユーザーの作成・削除が可能（ただしそのDB内に限る）。|
|`dbOwner`	|上記すべての権限を持つ（readWrite + dbAdmin + userAdmin）。|
|`enableSharding`	|シャーディングの有効化が可能（そのDBに対して）。|