Mongoose庫簡而言之就是對node環境中MongoDB數據庫操做的封裝,一種對象模型工具,能夠將數據庫中的數據轉換爲JavaScript對象供咱們使用。html
一種以文件形式存儲的數據庫模型骨架,不具有數據庫的操做能力,僅僅只是一段代碼,沒法通往數據庫端, 僅僅只是數據庫模型在程序片斷中的一種表現node
var BlogSchema = new Schema({
title:String,
author:String
});
複製代碼
Schema.Typemongodb
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模型,是通過Schema構造來的,是Schema的編譯版本。一個model的實例直接映射爲數據庫中的一個文檔。基於這種關係, 之後的增刪改查(CURD)都要經過這個Model實現。npm
//先建立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方法時才執行查詢,並且必須有回調。ubuntu
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。windows
1.required 非空驗證api
2.min/max 範圍驗證(邊值驗證)promise
3.enum/match 枚舉驗證/匹配驗證mongoose
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');
複製代碼
這裏咱們定義一個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;
複製代碼
這裏咱們定義一個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的使用等進階用法。