ドキュメント型 NoSQL「MongoDB」のコマンドの使い方（Windows版）

![MongoDB_Logo.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288256/c7d8bae2-fe94-5f4d-6bda-1a9ce035e91e.png)
#### 1. MongoDBとは
- MongoDBは、米国の10gen社（現MongoDB Inc.）によって開発された、ドキュメント指向型のNoSQLデータベース。
- C++言語で開発されており、Linux／Windows／Macなど各種プラットフォームに対応している。
- JSON形式のドキュメントでデータを管理するので、階層構造や、複数のデータ型を同一フィールドとした複雑なデータ構造も扱うことができる。
- 動的にドキュメントの構造を変更できるため、柔軟なデータベース設計が可能となる。
- SQLクエリは使用できない。集計、複数データの結合（JOIN）ができない。
- 複数のデータを同時に更新するような、一貫性（整合性）のある更新処理ができない。
- ログの蓄積、データ構造が可変するシステム、単純な低負荷の読み取り／更新が大量にあるようなシステム（例：ソーシャルゲーム、SNSなど）に向いている。

#### 2. MongoDBの導入（前準備）
- MongoDBをWidnowsローカルマシン上で動かします。MongoDBのサーバとクライアントのインストールファイルを各々ダウンロードして導入する。

:::note
MongoDB Community Server Download：
https://www.mongodb.com/try/download/community
:::

:::note
MongoDB Shell Download（CUI コマンドライン版）：
https://www.mongodb.com/try/download/community
:::

:::note
MongoDB Compass Download (GUI版)：
https://www.mongodb.com/try/download/compass
:::

#### 3. MongoDBサーバの起動
- Windows版をインストールした場合は、サービスで自動実行されています。
- サービスを手動実行する場合は、「コントロール・パネル」 ＞ 「サービス」 を開き、リストから MongoDB サービスを見つけ、起動／停止ボタンを使用する。 または、コマンドプロンプトより下記のコマンドでMongoDBを起動する。
　MongoDBのサービスを「起動」する場合（※管理者として実行）
```rb
> sc start MongoDB
```
  MongoDBのサービスを「停止」する場合（※管理者として実行）
```rb
> sc stop MongoDB
```

#### 4. MongoDBクライアントの起動
- MongoDB Shell（mongosh.exe）を起動する。ローカルにMongoDBサーバをインストールした場合は、exeファイルをダブルクリックするか、コマンドラインより「mongosh」とタイプして起動する。
```rb
> mongosh
```
デフォルトで使用するデータベースを指定しない場合、mongoshは”test”データベースをデフォルトで使用しするので、プロンプトに “test>” と表示される。

- ローカル環境とは別のサーバにMongoDBサーバをインストールした場合は、MongoDBサーバのホスト名（またはIPアドレス）、ポート番号、データベース名を指定して起動する。
```rb
> mongosh "mongodb://ホスト名:ポート番号/データベース名"
```

#### 5. MongoDBコマンド
コマンドラインのMongoDB Shellのコマンドを使って、MongoDBを操作する方法について説明します。

##### ■ データベースの一覧表示
show dbs（または show databases）でデータベースの一覧を確認する。
```rb
test> show dbs;
admin    40.00 KiB
config   60.00 KiB
local    72.00 KiB
mydb     **.** KiB
```

##### ■ データベースの作成／切り替え
use db名：データベース名が存在する場合は切り替え、存在しない場合は新規作成

「mydb」という名前でデータベースを作成する。
```rb
test> use mydb;
switched to db mydb
```

##### ■ コレクションの作成
「test_c」という名前でコレクションを作成する。
```rb
mydb> db.createCollection("test_c");
{ ok: 1 }
```

##### ■ コレクションにドキュメント（データ）を登録
「test_c」コレクションに
- { name: "太郎", age: 25, place:"東京都" }
- { name: "花子", age: 25, place:"千葉県" }
というドキュメント（データ）を登録する。

```rb
mydb> db.test_c.insertOne({ name: "太郎", age: 25, place:"東京都" });
{
  acknowledged: true,
  insertedId: ObjectId('659ae5788bcbc0db16bdab7d')
}
mydb> db.test_c.insertOne({ name: "花子", age: 29, place:"千葉県" });
{
  acknowledged: true,
  insertedId: ObjectId('659ae6f58bcbc0db16bdab7e')
}
```

##### ■ コレクションのドキュメント数（データ数）を確認
ドキュメントのドキュメント数（データ数）をカウントする。
```rb
mydb> db.test_c.count();
2
```

##### ■ コレクションの全ドキュメント内容を確認
ドキュメントのドキュメント数（データ数）をカウントする。
```rb
mydb> db.test_c.find();
[
  {
    _id: ObjectId('659ae5788bcbc0db16bdab7d'),
    name: '太郎',
    age: 25,
    place: '東京都'
  },
  {
    _id: ObjectId('659ae6f58bcbc0db16bdab7e'),
    name: '花子',
    age: 29,
    place: '千葉県'
  }
]
```

##### ■ データのフィルタリング（検索）
.find関数に引数を指定することで、特定の条件を持っているデータのみをフィルタ検索できる。

- name（名前）が「太郎」のデータを検索する。
```rb
mydb> db.test_c.find({name:"太郎"});
[
  {
    _id: ObjectId('659ae5788bcbc0db16bdab7d'),
    name: '太郎',
    age: 25,
    place: '東京都'
  }
]
```
- age（年齢）が30歳より下のデータを検索する。
```rb
mydb> db.test_c.find({age:{"$lt":30}});
[
  {
    _id: ObjectId('659ae5788bcbc0db16bdab7d'),
    name: '太郎',
    age: 25,
    place: '東京都'
  },
  {
    _id: ObjectId('659ae6f58bcbc0db16bdab7e'),
    name: '花子',
    age: 29,
    place: '千葉県'
  }
]
```
- age（年齢）が25歳より上のデータを検索する。
```rb
mydb> db.test_c.find({age:{"$gt":25}})
[
  {
    _id: ObjectId('659ae6f58bcbc0db16bdab7e'),
    name: '花子',
    age: 29,
    place: '千葉県'
  }
]
```

##### ■ ドキュメント（データ）の更新
アップデートするドキュメント（データ）が、
1件の場合：updateOne
複数個の場合：updateMany
を利用する。

- name（名前）が「太郎」のage（年齢）を25歳→29歳に更新する。
```rb
mydb> db.test_c.updateOne({name:"太郎"},{$set:{age:29}});
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}
```
- age（年齢）が29歳のドキュメント（データ）について、地域（place）を全て「神奈川県」に更新する。
```rb
mydb> db.test_c.updateMany({age:29},{$set:{place:"神奈川県"}});
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 2,
  modifiedCount: 2,
  upsertedCount: 0
}
```
- .find関数で、複数データが更新されたか確認する。
```rb
mydb> db.test_c.find();
[
  {
    _id: ObjectId('659ae5788bcbc0db16bdab7d'),
    name: '太郎',
    age: 29,
    place: '神奈川県'
  },
  {
    _id: ObjectId('659ae6f58bcbc0db16bdab7e'),
    name: '花子',
    age: 29,
    place: '神奈川県'
  }
]
```

##### ■ ドキュメント（データ）の削除
削除するするドキュメント（データ）が、
1件の場合：deleteOne
複数個の場合：deleteMany
を利用する。

- name（名前）が「花子」のドキュメント（データ）を削除する。
```rb
mydb> mydb> db.test_c.deleteOne({"name":"花子"})
{ acknowledged: true, deletedCount: 1 }
```

##### ■ コレクションの一覧表示
- 現在使用しているデータベースのコレクションの一覧を表示する。
```rb
mydb> show collections;
test_c
```

##### ■ コレクションの削除
- コレクションを削除する。
```rb
mydb> db.test_c.drop();
true
```

以上