學(xué)習(xí)mongoose之前,需要先安裝好,mongodb和node.js
mongodb簡介(引自菜鳥教程)
MongoDB 是由C++語言編寫的,是一個(gè)基于分布式文件存儲(chǔ)的開源數(shù)據(jù)庫系統(tǒng)。
在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。
MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對組成。MongoDB 文檔類似于 JSON 對象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。
安裝mongodb。我選擇使用brew安裝(我用的是mac)
如果你未安裝brew,請?jiān)诮K端使用如下命令:
curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --strip 1
當(dāng)brew安裝完成后,你需要先更新一下
brew update
更新過程可能很漫長,啥動(dòng)靜都沒有,請耐心等待。
更新完之后,你就可以安裝mongodb了。在終端的命令如下:
brew install mongodb
安裝完成后,會(huì)提示你啟動(dòng)Mongodb的方法,此時(shí)你在終端輸入如下命令行:
mongod --config /usr/local/etc/mongod.conf
如果此時(shí)沒反應(yīng),那么就說明你啟動(dòng)成功了。你可以在瀏覽器中輸入http://localhost:27017/,就能看的如下結(jié)果。

如果終端出現(xiàn) -bash: mongod: command not found
可以用如下代碼解決
export PATH="$PATH:/usr/local/opt/mongodb/bin"
其中$PATH后面代表的是你mongodb安裝的路徑。如果你是用brew安裝,那就是這個(gè)路徑。
然后進(jìn)入/usr/local/opt/mongodb/bin目錄,執(zhí)行如下命令
./mongo
如果啟動(dòng)時(shí)出現(xiàn)其他錯(cuò)誤,你或許需要使用如下命令,建立mongdb的存儲(chǔ)文件夾
mkdir -p /data/db
如果還不行,就谷歌吧。
如果關(guān)閉mongodb數(shù)據(jù)庫后,重啟不了。那就到/usr/local/opt/mongodb/bin目錄執(zhí)行
./mongod --repair
然后重啟mongod
mongod --config /usr/local/etc/mongod.conf
安裝mongoose可視化工具
我推薦工具Robomongo
下載地址。然后安裝。在mac下,系統(tǒng)不會(huì)允許你安裝不受信任的app,請?jiān)谠O(shè)置-安全與隱私中選擇任何來源。然后就可以安裝了。
如果你已經(jīng)啟動(dòng)了mongodb,那么打開使用Robomongo連接localhost:27017。

安裝node.js
點(diǎn)擊安裝教程
準(zhǔn)備工作做好了,接下來開始mongoose之旅。
快速開始mongoose
接下來使用命令行安裝mongoose (npm使用介紹)
npm install mongoose
我喜歡貓,我想要將我遇到的每一只貓記錄到mongodb中。首先,需要在我們的項(xiàng)目中包含mongoose,然后連接test-我們運(yùn)行在本地的MongoDB實(shí)例數(shù)據(jù)庫。
在項(xiàng)目中創(chuàng)建 getting-started.js。
// getting-started.js <em>連接數(shù)據(jù)庫</em>
let mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');
現(xiàn)在我們已經(jīng)嘗試連接了本地的測試數(shù)據(jù)庫。我們需要在連接數(shù)據(jù)庫成功或連接失敗的時(shí)候得到通知。
let db = mongoose.connection;
db.on('error',()=>{
console.error('連接失敗');
});
db.once('open', function () {
//回調(diào)函數(shù)
});
一旦我們鏈接成功,我們的回調(diào)函數(shù)將被調(diào)用。為了簡潔,我們假定接下來的所有代碼都在這個(gè)回調(diào)函數(shù)內(nèi)。
在Mongoose中,一切都是從Schema(模式)而來。接下來,我們將定義我們的貓。
let kittySchema = mongoose.Schema({
name:String
});
到目前還好,我們已經(jīng)得到了一個(gè)模式,帶有一個(gè)屬性name,name是一個(gè)字符串。接下來,我們將把我們的模式編譯成模型。
let Kitten = mongoose.model('Kitten',kittySchema);
一個(gè)模型是我們構(gòu)造文檔的一個(gè)類(文檔是MongoDB中數(shù)據(jù)的基本單元,非常類似于,關(guān)系型數(shù)據(jù)庫管理系統(tǒng)中的行)。既然這樣,每個(gè)文檔就是一只貓,這只貓上帶有我們在模式中已經(jīng)定義好的屬性和行為。接下來,讓我們創(chuàng)建一只貓的文檔。
let silence = new Kitten({name:"silence"});
貓會(huì)叫,那么讓我們看一看如何添加“speak"的功能到我們的文檔。
//注意:方法必須添加在模式被編譯為模型之前。
kittySchema.methods.speak = function(){
let greeting = this.name?'Memo name is '+this.name:"I don't have a name";
console.log(greeting);
}
//添加在下面代碼之前
let Kitten = mongoose.model('Kitten',kittySchema);
//此時(shí)將模式編譯成模型時(shí),會(huì)把模式功能方法屬性加入到模型的原型中,然后暴露在每個(gè)文檔實(shí)例,即這里的Kitten實(shí)例。
加入了speak功能后,我們的貓就會(huì)叫了。
silence.speak();//控制臺(tái)輸出 Memo name is silence
我們有了會(huì)說話的貓,但是我們還有保存任何東西到數(shù)據(jù)庫中。每個(gè)文檔都可以使用save方法保存到數(shù)據(jù)庫中。無論發(fā)生什么事情,save方法的第一個(gè)參數(shù)都是error。
silence.save(function(err,silence){
if(err){
return console.log(err);
}else{
console.log('保存成功');
}
});
隨著時(shí)間的流逝,我們想要看看我們之前存在數(shù)據(jù)庫中的貓,我們可以通過 Kitten模型讀取所有小貓的文檔。
Kitten.find({name:'silence'},function(err,target){
if(err){
console.error(err);
}else{
console.log(target);
}
});
上述代碼的意思是,查找一個(gè)名字為‘silence'的貓。find的回調(diào)函數(shù)的第一個(gè)參數(shù)永遠(yuǎn)是error。target表示我們查找的對象。
如果你想找到所有小貓的記錄,你可以去掉查找條件。
Kitten.find(function(err,target){
if(err){
console.error(err);
}else{
console.log(target);
}
});
你可以用正則查詢
Kitten.find({ name: /^Fluff/ }, callback)