Mongoose是在node.js環(huán)境下對mongodb進(jìn)行便捷操作的對象模型工具,因此,要使用mongoose,則必須安裝node.js環(huán)境以及mongodb數(shù)據(jù)庫,mongoose使mongodb操作更簡單便捷。
名詞解釋:
1、Schema: 一種以文件形式存儲(chǔ)的數(shù)據(jù)庫模型骨架,不具備數(shù)據(jù)庫的操作能力
2、Model: 由Schema編譯而成的假想(fancy)構(gòu)造器,具有抽象屬性和行為。Model的每一個(gè)實(shí)例(instance)就是一個(gè)document。document可以保存到數(shù)據(jù)庫和從數(shù)據(jù)庫返回。
3、Instance: 由Model創(chuàng)建的實(shí)例。
步驟:
1、連接MongoDB數(shù)據(jù)庫
connect
connect 用于創(chuàng)建數(shù)據(jù)庫連接
mongoose.connect(uri(s), [options], [callback])
//url(s):數(shù)據(jù)庫地址,可以是多個(gè),以,隔開
//options:可選,配置參數(shù)
//callback:可選,回調(diào)
mongoose.connect('mongodb://數(shù)據(jù)庫地址(包括端口號)/數(shù)據(jù)庫名稱')
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/data',function(err) {
if(err){
console.log('數(shù)據(jù)庫連接錯(cuò)誤!');
}else{
console.log('數(shù)據(jù)庫連接成功!');
}
})
連接多個(gè)數(shù)據(jù)庫
如果你的app中要連接多個(gè)數(shù)據(jù)庫,只需要設(shè)置多個(gè)url以,隔開,同時(shí)設(shè)置mongos為true
mongoose.connect('urlA,urlB,...', {
mongos : true
})
2、定義Schema
mongoose中任何任何事物都是從Schema開始的。每一個(gè)Schema對應(yīng)MongoDB中的一個(gè)集合(collection)。Schema中定義了集合中文檔(document)的樣式。( 其實(shí)就是定義表的數(shù)據(jù)結(jié)構(gòu))
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const blogSchema = new Schema({
title: String,
author: String,
body: String,
comments: [{ body: String, date: Date }],
date: { type: Date, default: Date.now },
hidden: Boolean,
meta: { votes: Number, favs: Number }
});
字段類型
schema中支持以下字段類型
- String
- Number
- Date
- Buffer
- Boolean
- Mixed
- ObjectId
- Array
如果之后想要在Schema中添加鍵,可以使用Schema#add方法。
schema中不僅僅可以設(shè)置字段類型,同時(shí)還可以設(shè)置默認(rèn)值(default),關(guān)聯(lián)文檔(ref),required等。_一旦設(shè)置了字段類型,如果出現(xiàn)錯(cuò)誤,比如某字段類型為Boolean,而輸入了一個(gè)其他類型,mongoose將會(huì)拋出類型錯(cuò)誤的提示。
3、創(chuàng)造一個(gè)model
Model是由Schema編譯而成的假想(fancy)構(gòu)造器,具有抽象屬性和行為。Model的每一個(gè)實(shí)例(instance)就是一個(gè)document。document可以保存到數(shù)據(jù)庫和對數(shù)據(jù)庫進(jìn)行操作。
//語法
mongoose.model(文檔名稱, Schema,集合名[表名])
mongoose.model(modelName, schema)
const BlogModel = mongoose.model('Blog', blogSchema)
module.exports = BlogModel
4、實(shí)例方法和靜態(tài)方法
Methods 實(shí)例方法
Model的實(shí)例是document。內(nèi)置實(shí)例方法如 save,可以通過methods屬性給實(shí)例自定義擴(kuò)展方法
ArticleSchema.methods.methodFunc = function() {
// body...
}
Statics 靜態(tài)方法
model的靜態(tài)方法很多,如find,update等,可以通過 statics屬性給 Model 添加自定義擴(kuò)展方法
ArticleSchema.statics.staticFunc = function() {
// body...
}
Methods 和 Statics 的區(qū)別
statics是給model添加方法,methods是給實(shí)例(instance)添加方法。methods和statics的區(qū)別