「全棧初探」- Mongoose的簡單使用

一诅福、準備工作

1. 啟動mongo數(shù)據(jù)庫

關(guān)于下載安裝啟動數(shù)據(jù)庫我這里就不做過多解釋沈条,谷歌下會有很多教程需忿,啟動成功后的命令窗如下所示:

image

2. 啟用可視化Mongo工具

這里我們用的是Robo 3T,為什么要用可視化工具呢蜡歹,因為小白對于命令行還是很陌生的屋厘,在命令行中查看數(shù)據(jù)庫的內(nèi)容有些不直觀,這個可視化工具的安裝包谷歌一下就闊以找到啦~

  1. 啟動可視化工具
  2. 連接數(shù)據(jù)庫(前提是已經(jīng)啟動了mongo數(shù)據(jù)庫)
image
  1. 新建數(shù)據(jù)庫mongoosetest
image

image
  1. 創(chuàng)建成功
image

數(shù)據(jù)庫準備工作完成后月而,我們進入代碼環(huán)節(jié)啦~

二汗洒、利用mongoose進行簡單的數(shù)據(jù)庫操作

1. 新建項目

  1. 新建空文件夾,命名為mongooseTest
  2. 啟動終端景鼠,進入該文件夾
  3. 在命令行中輸入npm init 初始化項目
npm init

這里有個小問題就是項目不能以駝峰命名,所以npm init后會讓你輸入一個別名,我們就叫mongoosetest好了铛漓,然后一直Enter溯香,項目創(chuàng)建成功。


image
  1. 下載依賴包 mongoose
npm i mongoose -s
  1. 完成項目創(chuàng)建浓恶,項目結(jié)構(gòu):
image

2. 連接數(shù)據(jù)庫

在根目錄下創(chuàng)建db.js玫坛,輸入以下代碼,監(jiān)聽connection的幾個事件包晰,如果以上操作都沒錯的話湿镀,那么就會監(jiān)聽第一個事件“connect”事件,表示連接數(shù)據(jù)庫成功伐憾,在最后勉痴,我們導出mongoose對象,以供其他模塊使用树肃。

/**
 * Created by vince on 2017/7/10.
 * db.js
 */
var mongoose = require('mongoose');
//設(shè)置mongo存儲路徑
var DB_URL = 'mongodb://localhost:27017/mongoosetest';

//連接數(shù)據(jù)庫
mongoose.connect(DB_URL);

//連接成功后輸出語句
mongoose.connection.on('connected',function () {
    console.log('Mongoose connect ' + DB_URL + " success");
});

//連接異痴裘現(xiàn)實錯誤原因
mongoose.connection.on('error',function (err) {
    console.log('Mongoose connect Error:' + err);
});

//連接斷開后輸出語句
mongoose.connection.on('disconnected',function () {
    console.log('Mongoose connect disconnected');
});

//導出mongoose對象
module.exports = mongoose;

運行db.js,如下圖所示:

image

第一步連接數(shù)據(jù)庫成功啦~

3. 新建Schema與發(fā)布Model

那么什么是Schema呢胸嘴?schema是mongoose里會用到的一種數(shù)據(jù)模式雏掠,可以理解為我們傳統(tǒng)數(shù)據(jù)庫中的表(table)結(jié)構(gòu)的定義,簡單地說劣像,就是一個數(shù)據(jù)模板乡话,每個schema會映射到mongodb中的一個collection,它不具備操作數(shù)據(jù)庫的能力耳奕。

那什么又是Model呢绑青?Model是由Schema發(fā)布生成的模型,具有抽象屬性和行為的數(shù)據(jù)庫操作對吮铭,Model可以直接操作Mongo數(shù)據(jù)庫中的數(shù)據(jù)时迫。

解釋完了代碼用說話,新建user.js谓晌,輸入以下代碼掠拳,創(chuàng)建一個user的schema,并且利用Schema發(fā)布一個Model纸肉,導出Model:

/**
 * Created by vince on 2017/7/10.  
 * user.js
 */
//引入之前我們創(chuàng)建的mongose對象
var mongoose = require('./db.js');
//創(chuàng)建一個schema對象
var Schema = mongoose.Schema;

//創(chuàng)建一個schema實例
var UserSchema = new Schema({
    username: {type: String},
    userpwd: {type: String},
    userage: {type: Number},
    logindate: {type: Date}
});

//利用UserSchema實例,發(fā)布一個User的model并且導出
module.exports = mongoose.model("User",UserSchema);

4. Model創(chuàng)造Entity實體溺欧,對數(shù)據(jù)庫操作

那Entity又是什么呢?Entity是由Model創(chuàng)建的實體柏肪,他的操作也會影響數(shù)據(jù)庫姐刁。

  • 新建insert.js,輸入以下代碼:
/**
 * Created by vince on 2017/7/10.
 * insert.js
 */
//引如User的Model
var User = require('./user');

//創(chuàng)建一個插入數(shù)據(jù)到數(shù)據(jù)庫中的函數(shù)

function insert() {

    //用Model創(chuàng)建一個Entity實體,就是一個User的數(shù)據(jù)
    var user_1 = new User({
        username: 'Vince Hua',
        userpwd: '123456',
        userage: 20,
        logindate: new Date()
    });

    //調(diào)用user_1的save方法烦味,插入user_1的數(shù)據(jù)到數(shù)據(jù)庫中
    user_1.save(function (err, res) {
        if(err){
            console.log("Error: " + err);
        }else{
            console.log("Success Res: " + res)
        }
    });
}
//執(zhí)行插入操作
insert();

以上代碼中的user_1就是Model創(chuàng)建的Entity實體聂使,它具有很多操作壁拉,svae()只是其中一個。

  • 運行insert.js柏靶,命令行輸入框得到一下結(jié)果:


    image
  • 我們再查看數(shù)據(jù)庫中:


    image
  • Amazing弃理,我們成功插入一個數(shù)據(jù)啦~

5. 總結(jié)Schema、Model屎蜓、Entity的關(guān)系

  • Schema : 一種以文件形式存儲的數(shù)據(jù)庫模型骨架痘昌,不具備數(shù)據(jù)庫的操作能力

  • Model : 由Schema發(fā)布生成的模型,具有抽象屬性和行為的數(shù)據(jù)庫操作對

  • Entity : 由Model創(chuàng)建的實體炬转,他的操作也會影響數(shù)據(jù)庫

  • Schema辆苔、Model、Entity的關(guān)系是:Schema生成Model扼劈,Model創(chuàng)造Entity驻啤,Model和Entity都可對數(shù)據(jù)庫操作造成影響,但Model比Entity更具操作性测僵。

三街佑、mongoose的其他一些 “騷操作”

  • 更新數(shù)據(jù)庫

這里我們是直接用Model來操作數(shù)據(jù)庫,新建update.js

/**
 * Created by vince on 2017/7/10.
 * update.js
 */
//引入User的Model
var User = require("./user.js");

function update(){
    //wherestr是我們要進行操作的數(shù)據(jù)
    var wherestr = {'username' : 'Vince Hua'};
    //update是我們更新的數(shù)據(jù)
    var updatestr = {'userpwd': 'hhhhhh'};

    User.update(wherestr, updatestr, function(err, res){
        if (err) {
            console.log("Error:" + err);
        }
        else {
            console.log("Update Res: " + res);
        }
    })
}

update();
  • 運行updata.js捍靠,操作成功沐旨,命令行輸出:
image
  • 更新成功,查看數(shù)據(jù)庫:
image
  • 刪除數(shù)據(jù)

同樣我們直接用Model操作數(shù)據(jù)庫榨婆,新建remove.js磁携,輸入以下代碼:

/**
 * Created by vince on 2017/7/10.
 * remove.js
 */
var User = require("./user");

function del() {
    //需要刪除的數(shù)據(jù)
    var wherestr = {'username' : 'Vince Hua'};

    User.remove(wherestr,function (err, res) {
        if(err){
            console.log("Error: " + err)
        }else{
            console.log("Success Remove: " + res);
        }
    })
}

del();
  • 執(zhí)行代碼,得到一下結(jié)果:
image
  • 查看數(shù)據(jù)庫良风,顯示數(shù)據(jù)已經(jīng)被刪除
image
  • 查找數(shù)據(jù)

  • 查找數(shù)據(jù)之前谊迄,我們插入一下幾個數(shù)據(jù)


    image

依舊是使用Model操作數(shù)據(jù)庫,新建find.js烟央,輸入以下代碼:

/**
 * Created by vince on 2017/7/10.
 * find.js
 */
var User = require('./user');
function findByConditions() {
    var wherestr = {'username' : 'Mike Guo'};
    User.find(wherestr,function (err, res) {
        if(err){
            console.log("Error: " + err);
        }else{
            console.log("Find Res: " + res);
        }
    });
}
findByConditions();
  • 執(zhí)行代碼统诺,得到查詢結(jié)果:
image

四、總結(jié)

這里介紹的知識簡單的mongoose的增刪改查操作疑俭,只是方便我們第一次接觸Mongo入門的小練習的Demo而已粮呢,mongoose還有其他強大的操作這里沒有一一介紹,希望小伙伴們可以查看中文文檔了解更多钞艇,如果你看了這篇文章覺得自己已經(jīng)入門啦啄寡,那么恭喜你~

  • 所有代碼已經(jīng)上傳到GitHub,傳送門: Demo代碼
  • nice to meet you ~ 哩照,給個小star鼓勵下??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挺物,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子飘弧,更是在濱河造成了極大的恐慌识藤,老刑警劉巖砚著,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痴昧,居然都是意外死亡赖草,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門剪个,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人版确,你說我怎么就攤上這事扣囊。” “怎么了绒疗?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵侵歇,是天一觀的道長。 經(jīng)常有香客問我吓蘑,道長惕虑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任磨镶,我火速辦了婚禮溃蔫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘琳猫。我一直安慰自己伟叛,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布脐嫂。 她就那樣靜靜地躺著统刮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪账千。 梳的紋絲不亂的頭發(fā)上侥蒙,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音匀奏,去河邊找鬼鞭衩。 笑死,一個胖子當著我的面吹牛攒射,可吹牛的內(nèi)容都是我干的醋旦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼会放,長吁一口氣:“原來是場噩夢啊……” “哼饲齐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咧最,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捂人,失蹤者是張志新(化名)和其女友劉穎御雕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滥搭,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡酸纲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瑟匆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闽坡。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖愁溜,靈堂內(nèi)的尸體忽然破棺而出疾嗅,到底是詐尸還是另有隱情,我是刑警寧澤冕象,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布代承,位于F島的核電站,受9級特大地震影響渐扮,放射性物質(zhì)發(fā)生泄漏论悴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一墓律、第九天 我趴在偏房一處隱蔽的房頂上張望膀估。 院中可真熱鬧,春花似錦耻讽、人聲如沸玖像。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捐寥。三九已至,卻和暖如春祖驱,著一層夾襖步出監(jiān)牢的瞬間握恳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工捺僻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乡洼,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓匕坯,卻偏偏與公主長得像束昵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子葛峻,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容