Node.js中的Mongoose實用筆記
mongoose官網 http://mongoosejs.com/
1.Mongoose學習參考文件
前言:本學習參考文件僅供參考,如有問題,師請雅正
##一、快速通道
###1.1 名詞解釋
-
Schema
: 一種以檔案形式儲存的資料庫模型骨架,不具備資料庫的操作能力 -
Model
: 由Schema
釋出生成的模型,具有抽象屬性和行為的資料庫操作對 -
Entity
: 由Model
建立的實體,他的操作也會影響資料庫
注意:
1.本學習文件採用嚴格命名方式來區別不同物件,例如:
varPersonSchema;//Person的文字屬性 varPersonModel;//Person的資料庫模型varPersonEntity;//Person實體
2.Schema
、Model
、Entity
的關係請牢記,Schema
生成Model
,Model
創造Entity
,Model
和Entity
都可對資料庫操作造成影響,但Model
比Entity
更具操作性。
##1.2 準備工作
2.在專案只能夠建立一個數據庫連線,如下:
var mongoose =require('mongoose');//引用mongoose模組var db = mongoose.createConnection('localhost','test');//建立一個數據庫連線
3.開啟本機localhost
的test
資料庫時,我們可以監測是否有異常
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. 具體的如何配置Schema
、Model
以及Model
和Entity
的相關操作,我們會在後面進行
2.
Model
和Entity
都有能影響資料庫的操作,但仍有區別,後面我們也會做解釋
##二、新手指引
如果您還不清楚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
Buffer
和ArrayBuffer
是Nodejs
兩種隱藏的物件,相關內容請檢視NodeJS-API
####1.6 關於Mixed
Schema.Types.Mixed
是Mongoose
定義個混合型別,該混合型別如果未定義具體形式。因此,如果定義具體內容,就直接使用{}
來定義,以下兩句等價
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
Array
在JavaScript
程式語言中並不是陣列,而是集合,因此裡面可以存入不同的值,以下程式碼等價:
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
不僅要為後面的Model
和Entity
提供公共的屬性,還要提供公共的方法。
下面例子比快速通道的例子更加高階,可以進行高階擴充套件:
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: