mongoose基本用法

艾倫先生發表於2017-12-14

什麼是Mongoose

Mongoose庫簡而言之就是對node環境中MongoDB資料庫操作的封裝,一種物件模型工具,可以將資料庫中的資料轉換為JavaScript物件供我們使用。

模式、模型

Schema(模式)

一種以檔案形式儲存的資料庫模型骨架,不具備資料庫的操作能力,僅僅只是一段程式碼,無法通往資料庫端, 僅僅只是資料庫模型在程式片段中的一種表現

var BlogSchema = new Schema({
  title:String,
  author:String
});
複製程式碼
  • Schema.Type

    Schema.Type是由Mongoose內定的一些資料型別,基本資料型別都在其中,Mongoose也內建了一些特有的Schema.Type

      var ExampleSchema = new Schema({
        name:String,
        binary:Buffer,
        living:Boolean,
        updated:Date,
        age:Number,
        mixed:Schema.Types.Mixed, //該混合型別等同於nested
        _id:Schema.Types.ObjectId,  //主鍵
        _fk:Schema.Types.ObjectId,  //外來鍵
        array:[],
        arrOfString:[String],
        arrOfNumber:[Number],
        arrOfDate:[Date],
        arrOfBuffer:[Buffer],
        arrOfBoolean:[Boolean],
        arrOfMixed:[Schema.Types.Mixed],
        arrOfObjectId:[Schema.Types.ObjectId]
      });
    複製程式碼

Model(模型)

Model模型,是經過Schema構造來的,是Schema的編譯版本。一個model的例項直接對映為資料庫中的一個文件。基於這種關係, 以後的增刪改查(CURD)都要通過這個Model實現。

//先建立Schema
var UserSchema = new Schema({
  name:'String',
  sex:'String' 
});
//通過Schema建立Model
var UserModel = mongoose.model('User',UserSchema );
複製程式碼

查詢

直接查詢

PersonModel.findOne({'name.last':'dragon'},function(err,person){});
複製程式碼

###鏈式查詢 這種方式相對直接查詢,分的比較明細,如果不帶callback,則返回query,該query物件執行的方法都將返回自己,只有在執行exec方法時才執行查詢,而且必須有回撥。

Person
  .find({ occupation: /host/ })
  .where('name.last').equals('Ghost')
  .where('age').gt(17).lt(66)
  .where('likes').in(['vaporizing', 'talking'])
  .limit(10)
  .sort('-occupation')
  .select('name occupation')
  .exec(callback);
複製程式碼

##驗證Validation 資料的儲存是需要驗證的,不是什麼資料都能往資料庫裡丟或者顯示到客戶端的,如果驗證失敗,則會返回err。

1.required 非空驗證

2.min/max 範圍驗證(邊值驗證)

3.enum/match 列舉驗證/匹配驗證

4.validate 自定義驗證規則

var PersonSchema = new Schema({
  name:{
    type:'String',
    required:true //姓名非空
  },
  age:{
    type:'Nunmer',
    min:18,       //年齡最小18
    max:120     //年齡最大120
  },
  city:{
    type:'String',
    enum:['北京','上海']  //只能是北京、上海人
  },
  other:{
    type:'String',
    validate:[validator,err]  //validator是一個驗證函式,err是驗證失敗的錯誤資訊
  }
});
複製程式碼

使用初步

安裝檔案

npm install mongoose --save
複製程式碼

引入依賴

var mongoose = require("mongoose")
mongoose.connect('mongodb://localhost/testDataBase');
複製程式碼

定義schema

這裡我們定義一個userSchema.js檔案

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var UserSchema = new Schema({
  uid: {
      type: String,
    required: true, 
    unique: true
  },
  logLevel: {
    type: String,
    default: 'info'
  },
  meta: {
    createAt: {
      type: Date,
      default: Date.now()
    },
    updateAt: {
      type: Date,
      default: Date.now()
    }
  }
});

UserSchema.pre('save', function (next) {
  if (this.isNew) {
    this.meta.updateAt = this.meta.createAt = Date.now();
  } else {
    this.meta.updateAt = Date.now();
  }
  next()
});

UserSchema.statics = {
  fetch: function (cb) {
    return this.find({})
      .sort('meta.createAt')
      .exec(cb)
  },
  findById: function (id, cb) {
    return this.findOne({_id: id})
      .sort('meta.createAt')
      .exec(cb);
  },
  findByUid: function (uid, cb) {
    return this.findOne({uid: uid})
      .sort('meta.createAt')
      .exec(cb);
  }
};

module.exports = UserSchema;
複製程式碼

將schema釋出為Model

這裡我們定義一個userModule.js檔案。用於引用schema,釋出為model,向外匯出。

var mongoose = require('mongoose');
var UserSchema = require('./userSchema');

var User = mongoose.model('User',UserSchema);

module.exports = User;
複製程式碼

增刪改查

在controller層引入這個model,就可以使用之前定義的靜態方法了。這個model還擁有Model.create(),Model.find(),Model.update(),Model.remove()方法,進行基本的CURD操作。下面舉個簡單的例子,實現增刪改查功能。

var _ = require('underscore');
var User = require('../models/user');

module.exports = {
  //  通過例項化model,建立一個model例項
  add: function(req, res, next) {

    var _user = new User(req.body.user);//相當於呼叫了Model.create(req.body)
    _user.save(function (err, user) {
      if (err) {
        //doSomething...
      } else {
        //doSomething...
      }
    })
  },

  delete: function (req, res) {
    var id = req.query._id;
  
    User.remove({_id: id}, function (err) {
      if (err) {
        //doSomething...
      } else {
        //doSomething...
      }
    })
  },
  update: function (req, res) {
   
    var id = req.body.id;
    var userParams = req.body;

    User.findById(id, function (err, user) {
      if (err) {
        //doSomething...
      } else {
        _user = _.extend(user, userParams);
        _user.save(function (err, user) {
          if(err) {
            //doSomething...
          } else {
            //doSomething...
          }
        })
      }
    })
  },
  list: function (req, res) {
    User.fetch(function (err, users) {
      var resultUsers=_.map(users, function(user){
      if (err){
        //doSomething...
      } else {
        //doSomething...
      }
    })
  },
};
複製程式碼

結尾

本篇文章介紹了mongoose的基本概念和使用事例,下篇文章中,會繼續探討schema的幾種方法,使用promise方式代替回撥呼叫、population的使用等進階用法。

相關文章