12
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

mongooseを使ってmongoDBを記述する

Last updated at Posted at 2020-06-21

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

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

##※MongoDBとMySQLの呼称の違い

MySQL
データは「テーブル」の形で保存される。 スクリーンショット 2020-06-21 17.04.15.png

・列(column)
 スクリーンショット 2020-06-21 17.05.20.png

・行(row)
スクリーンショット 2020-06-21 17.06.20.png

MongoDB(NoSQL)
データは「コレクション」の形で保存される スクリーンショット 2020-06-21 17.07.23.png

・フィールド(列に対応)
スクリーンショット 2020-06-21 17.09.01.png

・ドキュメント(行に対応)
スクリーンショット 2020-06-21 17.08.41.png

・アプリ作成時のファイル構成例
└── 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 ) スクリーンショット 2020-06-21 17.28.09.png

<例>

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」を利用し、メールアドレスとして正しい値か確認
      }
    }
  },
12
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?