mongooseを使ってmongoDBを記述する


mongooseとは

MongoDBを操作するためのnpmモジュール。
MongoDBのフィールドに様々な入力設定を行うことができる。

フィールドに挿入するデータ型を設定することができる。

※MongoDBとMySQLの呼称の違い

MySQL

データは「テーブル」の形で保存される。

・列(column)
 

・行(row)

MongoDB(NoSQL)

データは「コレクション」の形で保存される

・フィールド(列に対応)

・ドキュメント(行に対応)

・アプリ作成時のファイル構成例
└── src
    ├── db
    │   └── mongoose.js     //mongooseのnpmモジュールを読み込み
    ├── index.js           //アプリのメイン処理を記述
    ├── models
    │   ├── task.js        //taskデータベースのためのフィールド設定
    │   └── user.js       //userデータベースのためのフィールド設定
    └── routers
        ├── task.js       //express・taskデータベース操作のためのルーティング処理
        └── user.js       //express・userデータベース操作のためのルーティング処理

mongooseの読み込み

・「npmパッケージ『mongoose』、公式ドキュメント」を参照
https://www.npmjs.com/package/mongoose

プロジェクトファイルに、「npm i mongoose」でmongooseをインストール

・mongooseを読み込む

「mongooseの公式ドキュメント」( https://mongoosejs.com/ )を参照し、読み込みのためのコードを記述。

<mongoose.js>


const mongoose = require('mongoose')

//mongodbのポートの読み込みと、mongoDBのコレクション名(task-manager-api)をつける
mongoose.connect('mongodb://localhost:27017/task-manager-api', {
  useNewUrlParser: true, 
  useUnifiedTopology: true,
  useFindAndModify: false
});

<参考>「mongooseの公式ドキュメント」( https://mongoosejs.com/ )のコード


//mongooseモジュールの読み込み
const mongoose = require('mongoose');
//mongodbのポートの読み込みと、mongoDBのコレクション名(test)をつける
mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true, useUnifiedTopology: true});

//const Cat:Catというドキュメントを作成
//'Cat':データモデルの名前
//nameフィールドのデータ型をStringに設定。
const Cat = mongoose.model('Cat', { name: String });

//"Cat"データモデルの新しいインスタンスを作成。
//kittyというドキュメントで、nameは'Zildjian'
const kitty = new Cat({ name: 'Zildjian' });

//kittyドキュメントをデータベースに保存する。保存できたら"meow"と表示させる
kitty.save().then(() => console.log('meow'));

mongooseで挿入するデータ型を設定する

・入力するデータ型を設定

<公式ドキュメント>
"Schemas"を参照( https://mongoosejs.com/docs/guide.html#statics )

<例>

const Cat = mongoose.model('Cat', { 
  name: {
     type: String  //データ型は文字列
},
  age: {
     type: Number //データ型は数字
},
  isMine: {
     type: Boolean  //データ型はtrueかfalseのどちらか
}
});

・入力するデータ形式を自作・最小値/最大値の設定・入力必須設定・エラー設定

<公式ドキュメント>
"Validation"を参照( https://mongoosejs.com/docs/validation.html#built-in-validators )

・小文字として認識・空白スペースの削除(データサニタイズ)
const User = mongoose.model('User', {
  password:{
    type: String,
    required: true,  //入力必須設定
    trim: true,  //空白を無くして認識
    minlength: 7, //最小入力文字数設定

  //validate(value:入力した値)で、入力するデータ形式を自作
    validate(value){
       //toLowerCaseで、小文字も大文字も小文字と認識する設定
      if(value.toLowerCase().includes('password')){

    //エラーを起こして処理を分岐させる
        throw new Error ('Do not use "password" to password')
      }
    }
  }
・デフォルトの入力を設定
const Task = mongoose.model('Task', {
  complete:{
    type: Boolean,
    default: false,  //デフォルトの入力値を設定
  }
})
・データベースに入力す値を一意に設定
email: {
    type: String,
    unique: true, //データベース上のemailの値を一意にする›
    required: true,
    trim: true,
    lowercase: true,
    validate(value){
      if(!validator.isEmail(value)){
        throw new Error ('Email is invalid') //npmパッケージ、「validator」を利用し、メールアドレスとして正しい値か確認
      }
    }
  },