mongoDB, mongoose を使ったMongoDBへの接続方法

### mongoDBでDBに接続
1. 接続先のmongoDBのURIを指定してMongoClientのインスタンスを作成する
    - **URIの末尾にDB名を指定**しないとデータを参照できないので注意
    - `***.mongodb.net/DB名?***` ←のようなイメージ
2. MongoDBと接続して、接続先のコレクションを取得する
    - `await client.connect()` DBとの接続処理
    - `client.db("****")` データベース名を指定して接続したいDBを取得
    - `db.collection("****")`  コレクション名を指定して接続したいコレクションを取得
3. コレクションに対して処理（CRUD処理など）を記述して、処理が完了したらDB接続を解除
```JavaScript
import { MongoClient, ObjectId, ServerApiVersion } from "mongodb";

// MongoClientのインスタンスを作成
const client = new MongoClient(******, {
  serverApi: {
    version: ServerApiVersion.v1,
    strict: true,
    deprecationErrors: true,
  },
});

// DBと接続する処理を行い、Collectionを取得する処理を記述
async function getCollection() {
  try {
    await client.connect();
    const db = client.db("****");
    return db.collection("****");
  } catch {
    console.dir;
  }
}

// Collectionに対して処理を記述して、完了したらDBとの接続を解除する
async function getData() {
  const data = await getCollection();
  const cursor = data.find(); // 一覧を取得する処理
  const result = await cursor.toArray(); // 取得した値を配列にする処理

  await client.close(); // DBとの接続を解除する処理
}

getData()
```

### mongooseでDBに接続
1. 接続先のmongoDBのURIを指定してDBの起動と接続を行う
    - **URIの末尾にDB名を指定**しないとデータを参照できないので注意
    - `***.mongodb.net/DB名?***` ←のようなイメージ
2. 取得したいコレクションのSchemaとModelを定義する
    - `new Schema()` Schemaを定義する ※new mongoose.Schema() と同じ
    - `model("***", ***Schema)` Modelを定義する ※new mongoose.model() と同じ
    - modelの第一引数は `コレクション名` にする
    - modelの第二引数は `定義したSchema` にする
3. `Model.メソッド()` でコレクションに対して処理（CRUD処理など）を記述する
```JavaScript
import { connect, Schema, model } from "mongoose";

// MongoDBを起動して接続する
connect(******, { // 接続先のmongoDBのURIを指定
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

// Schemaを定義する
const dataSchema = new Schema(
  {
    title: { type: String, required: true },
    description: { type: String, required: true },
  },
  {
    timestamps: true, // 新規作成時や編集更新時に createdAt, updatedAt を自動的に設定するための記述
  }
);

// Modelを定義する
const Data = model("Data", dataSchema);

// データを取得する
await Data.find()
```

### express × mongoDB の実装例
- localhost:8080 -> 該当のコレクションの全データをJSONで返却する
- localhost:8080/:id -> 該当のコレクションのドキュメント情報をJSONで返却する
```JavaScript:main.js
import express from "express";
import { MongoClient, ObjectId, ServerApiVersion } from "mongodb";

const app = express();

const client = new MongoClient(******, {
  serverApi: {
    version: ServerApiVersion.v1,
    strict: true,
    deprecationErrors: true,
  },
});

async function getCollection(dbName, collectionName) {
  try {
    await client.connect();
    const db = client.db(dbName);
    return db.collection(collectionName);
  } catch {
    console.dir;
  }
}

// 一覧取得
app.get("/", async function (req, res) {
  const collection = await getCollection("DB名", "コレクション名");
  const cursor = collection.find();
  const result = await cursor.toArray();

  res.json(result);
  await client.close();
});

// 詳細情報取得
app.get("/:id", async function (req, res) {
  const id = req.params.id;
  const collection = await getCollection("DB名", "コレクション名");
  const result = await collection.findOne({ _id: ObjectId(id) });

  res.json(result);
  await client.close();
});

app.listen(8080, () => {
  console.log("Server start!");
});

```

### express × mongoose の実装例
- localhost:8080 -> 該当のコレクションの全データをJSONで返却する
- localhost:8080/:id -> 該当のコレクションのドキュメント情報をJSONで返却する
```JavaScript:main.js
import express from "express";
import { connect, Schema, model } from "mongoose";
import env from "dotenv";

env.config();
const app = express();

connect(process.env.MONGO_URI, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

const dataSchema = new Schema({
  title: { type: String, required: true },
  description: { type: String, required: true },
});

const Data = model("Data", dataSchema);

// 一覧取得
app.get("/", async function (req, res) {
  const result = await Data.find();
  res.json(result);
});

// 詳細情報取得
app.get("/:id", async function (req, res) {
  const id = req.params.id;
  const result = await Data.findById(id);
  res.json(result);
});

app.listen(8080, () => {
  console.log("Server start!");
});
```