nodejs + express + mongoDB のCRUDまとめ

# はじめに
mongoDBはNon-SQLとしてMySQLのような行列のデータではなく、JSON構造のデータである。そもそもクラウドデータベースなので、環境を変えながら開発をしたい場合、個人が気軽にデータベースを持ちたい場合、利点を持つ。ここではnodejs + mongodbを用いた基本的はCRUD (Create, Read, Update, Delete)をPostmanを用いて簡単にまとめた。

## PostManの参考

https://qiita.com/notch0314/items/97c7d1bb565fdae4a712


# 環境
mongodb 4.12.1
window 10
express: 4.18.2

## MongoDB
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/4c2c48e5-11c4-df98-6003-5d45b6197feb.png)
Database -> Cluster0 -> Connect


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/ee1c4f3f-2351-cfbf-cd57-e4549164aba2.png)

Connect your application

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/2d032671-86a9-c4dd-6d0b-99c88503f553.png)
Node,jsを選択し、中の内容をコピーして置きます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/f332a94b-4492-8500-77ea-d266c0a7a61a.png)

Database -> (Browse) Collections -> Create Database
私はnodejs-work-requestとしてDatabaseをつくり、そこにusersというcollectionをつくりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/a619dc5e-1ac8-1d81-ebb2-1b1083cb4089.png)

INSERT DOCUMENTからデータを１個作っておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/9993d0e4-976b-27a0-425d-2c7d30298af6.png)

Database Access からADD NEW DATABASE USER
DATABASEに接続するためのID, Passwordを設定しておきます。


# CRUD
## 基本設定
```javascript:server.js
const express = require('express');
const app = express();
const { ObjectID } = require('bson');
require('dotenv').config()
app.use(express.json());

var db
const MongoClient = require('mongodb').MongoClient
MongoClient.connect(`mongodb+srv://${process.env.MONGODB_ID}:${process.env.MONGODB_PASSWORD}@cluster0.akash.mongodb.net/?retryWrites=true&w=majority`, function (err, client) {
    if (err) return console.log(err)

    db = client.db('nodejs-work-request')
    app.listen(8080, function () {
        console.log('listening on 8080')
    })
})

//この下にCRUD
```
ここでは`.evn`ファイルに保存していますが、
`{process.env.MONGODB_ID}`、`{process.env.MONGODB_PASSWORD}`の代わりに先ほど設定したDabase Access UserのIDとパスワードを入力
## Read
```javascript
app.get('/users/:id', function (req, res) {
    // (req.params.idはStringなので、ObjectIDとして変換します。
    db.collection('users').findOne({_id: ObjectID(req.params.id)}, (err, result) => {
        res.send(result)
    })
})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/4859dad4-ca00-b84e-ba73-2bdd157a3b58.png)
 


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/a530e415-6b5c-0221-143c-461f19c1ed1f.png)


## Create
```javascript
app.post('/users', function (req, res) { 
    db.collection('users').insertOne({ user_name: req.body.user_name, age: req.body.age })
    res.send('saved')
})

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/5ac11538-2a84-2365-327a-8d8c7448ea0f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/0c4c4c95-2ab2-1ee4-0b7f-c2fdf9c7b41f.png)




## Update
```javascript
app.put('/users', function (req, res) {
    db.collection('users').updateOne({ _id: ObjectID(req.body.id) },
        { $set: { user_name: req.body.user_name, age: req.body.age } },
        function (err, result) {
            res.send('update done')
        })
})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/9d60163f-60a2-538c-4b84-bc6d6a7a0cdf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/c0f8beb0-369d-deb1-d652-d1ee3b84bcc5.png)



## Delete
```javascript
app.delete('/users', function(req, res) {
    db.collection('users').deleteOne({_id: ObjectID(req.body.id)}, function(err, result) {
        res.send('delete done')
    })
})
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/32454fe9-bebd-c41b-c496-c158b083ea22.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/4859dad4-ca00-b84e-ba73-2bdd157a3b58.png)
 

# まとめ
MYSQLの方が使用率は圧倒的に高いと言えるが、サーバーを持たず、クラウド型でデータベースを使えることは、個人で開発・勉強をする上ではとてもメリットがある。そして、もしサーバーをデプロイしたときに、自分でデータベースを管理できる。しかし、NonSQLなので、今まで簡単に使っていたJOINでまとめてデータを入手することは少し工夫が必要そうです。