1. 程式人生 > >Node.js中的Mongoose實用筆記

Node.js中的Mongoose實用筆記

mongoose官網  http://mongoosejs.com/

1.Mongoose學習參考文件

前言:本學習參考文件僅供參考,如有問題,師請雅正

##一、快速通道

###1.1 名詞解釋

  • Schema : 一種以檔案形式儲存的資料庫模型骨架,不具備資料庫的操作能力

  • Model : 由Schema釋出生成的模型,具有抽象屬性和行為的資料庫操作對

  • Entity : 由Model建立的實體,他的操作也會影響資料庫

注意

1.本學習文件採用嚴格命名方式來區別不同物件,例如:

varPersonSchema;//Person的文字屬性
varPersonModel;//Person的資料庫模型varPersonEntity;//Person實體

2.SchemaModelEntity的關係請牢記,Schema生成ModelModel創造EntityModelEntity都可對資料庫操作造成影響,但ModelEntity更具操作性。

##1.2 準備工作

2.在專案只能夠建立一個數據庫連線,如下:

var mongoose =require('mongoose');//引用mongoose模組var db = mongoose.createConnection('localhost','test');//建立一個數據庫連線

3.開啟本機localhosttest資料庫時,我們可以監測是否有異常

    db.on('error',console.error.bind(console,'連線錯誤:'));
    db.once('open',function(){//一次開啟記錄});

注意

成功開啟資料庫後,就可以執行資料庫相應操作,假設以下程式碼都在回撥中處理

4.定義一個Schema

varPersonSchema=new mongoose.Schema({
      name:String//定義一個屬性name,型別為String});

5.將該Schema釋出為Model

varPersonModel= db.model('Person',PersonSchema);//如果該Model已經發布,則可以直接通過名字索引到,如下://var PersonModel = db.model('Person');//如果沒有釋出,上一段程式碼將會異常

6.用Model建立Entity

var personEntity =newPersonModel({name:'Krouky'});//列印這個實體的名字看看
    console.log(personEntity.name);//Krouky

7.我們甚至可以為此Schema建立方法

//為Schema模型追加speak方法PersonSchema.methos.speak =function(){
      console.log('我的名字叫'+this.name);}varPersonModel= db.model('Person',PersonSchema);var personEntity =newPersonModel({name:'Krouky'});
    personEntity.speak();//我的名字叫Krouky

8.Entity是具有具體的資料庫操作CRUD

    personEntity.save();//執行完成後,資料庫就有該資料了

9.如果要執行查詢,需要依賴Model,當然Entity也是可以做到的

PersonModel.find(function(err,persons){//查詢到的所有person});

注意

1. 具體的如何配置SchemaModel以及ModelEntity的相關操作,我們會在後面進行

2. ModelEntity都有能影響資料庫的操作,但仍有區別,後面我們也會做解釋

##二、新手指引

如果您還不清楚Mongoose是如何工作的,請參看第一章快速通道快速瀏覽他的用法吧

###1. Schema——純潔的資料庫原型

####1.1 什麼是Schema

  • 我理解Schema僅僅只是一斷程式碼,他書寫完成後程式依然無法使用,更無法通往資料庫端
  • 他僅僅只是資料庫模型在程式片段中的一種表現,或者是資料屬性模型

####1.2 如何定義Schema

varBlogSchema=newSchema({
      title:String,
      author:String//new Schema()中傳入一個JSON物件,該物件形如 xxx:yyyy ,/xxx是一個字串,定義了屬性,yyy是一個Schema.Type,定義了屬性型別});

####1.3 什麼是Schema.Type

Schema.Type是由Mongoose內定的一些資料型別,基本資料型別都在其中,他也內建了一些Mongoose特有的Schema.Type。當然,你也可以自定義Schema.Type,只有滿足Schema.Type的型別才能定義在Schema內。

####1.4 Schema.Types

NodeJS中的基本資料型別都屬於Schema.Type,另外Mongoose還定義了自己的型別

//舉例:varExampleSchema=newSchema({
      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]
      nested:{
        stuff:String,}});

####1.5 關於Buffer

BufferArrayBufferNodejs兩種隱藏的物件,相關內容請檢視NodeJS-API

####1.6 關於Mixed

Schema.Types.MixedMongoose定義個混合型別,該混合型別如果未定義具體形式。因此,如果定義具體內容,就直接使用{}來定義,以下兩句等價

varAnySchema=newSchema({any:{}});varAnySchema=newSchema({any:Schema.Types.Mixed});

混合型別因為沒有特定約束,因此可以任意修改,一旦修改了原型,則必須呼叫markModified()

    person.anything ={x:[3,4,{y:'change'}]}
    person.markModified('anything');//傳入anything,表示該屬性型別發生變化
    person.save();

####1.7 關於ObjectId

主鍵,一種特殊而且非常重要的型別,每個Schema都會預設配置這個屬性,屬性名為_id,除非自己定義,方可覆蓋

var mongoose =require('mongoose');varObjectId= mongoose.Schema.Types.ObjectId;varStudentSchema=newSchema({});//預設會有_id:ObjectIdvarTeacherSchema=newSchema({id:ObjectId});//只有id:ObjectId

該型別的值由系統自己生成,從某種意義上幾乎不會重複,生成過程比較複雜,有興趣的朋友可以檢視原始碼。

####1.8 關於Array

ArrayJavaScript程式語言中並不是陣列,而是集合,因此裡面可以存入不同的值,以下程式碼等價:

varExampleSchema1=newSchema({array:[]});varExampleSchema2=newSchema({array:Array});varExampleSchema3=newSchema({array:[Schema.Types.Mixed]});varExampleSchema4=newSchema({array:[{}]});

####1.9 附言

Schema不僅定義了文件結構使用效能,還可以有擴充套件外掛例項方法靜態方法複合索引文件生命週期鉤子

Schema可以定義外掛,並且外掛具有良好的可拔插性,請有興趣的讀者繼續往後閱讀或者查閱官方資料。

###2. Schema的擴充套件

####2.1 例項方法

有的時候,我們創造的Schema不僅要為後面的ModelEntity提供公共的屬性,還要提供公共的方法。

下面例子比快速通道的例子更加高階,可以進行高階擴充套件:

varPersonSchema=newSchema({name:String,type:String});//查詢類似資料PersonSchema.methods.findSimilarTypes =function(cb){returnthis.model('Person').find({type:this.type},cb);}

使用如下:

varPersonModel= mongoose.model('Person',PersonSchema);var krouky =newPersonSchema({name:'krouky',type: