Node.js從白癡到入門(五):MongoDB

什么是MongoDB何之?

MongoDB是一個(gè)非關(guān)系型的數(shù)據(jù)庫(kù),它和我們之前比價(jià)屬性的關(guān)系型數(shù)據(jù)庫(kù)不一樣,沒有表和記錄的概念晌块,取而代之的是集合和對(duì)象爱沟。一個(gè)數(shù)據(jù)庫(kù)包含多個(gè)集合,一個(gè)集合包含多個(gè)對(duì)象匆背。每個(gè)對(duì)象的屬性可以不同呼伸,也就是說同一個(gè)集合下一條記錄包含屬性a另一條記錄包含屬性b而沒有屬性a。MongoDB使用上比較隨意钝尸,適合web以及物聯(lián)網(wǎng)之類的散列數(shù)據(jù)存放括享,適合數(shù)據(jù)結(jié)構(gòu)經(jīng)常需要改變的情況,但不支持事務(wù)珍促,不保證數(shù)據(jù)的完整性铃辖,換句話說數(shù)據(jù)并不是很可靠。MongoDB算是比較新的數(shù)據(jù)庫(kù)了踢星,據(jù)說性能很高澳叉,支持分布式存儲(chǔ),可以創(chuàng)建索引沐悦。
MongoDB并不能替代傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)(要求不高是可以的),典型的以空間換時(shí)間五督,會(huì)占用較多的磁盤空間藏否,索引以及一些熱數(shù)據(jù)會(huì)放在內(nèi)存中,會(huì)占用很多內(nèi)存空間充包,盡量不要和占內(nèi)存服務(wù)放一起副签。
簡(jiǎn)單是說MongoDB是一個(gè)比較自由但不太靠譜(相對(duì)而言,穩(wěn)定性還是有保障的)的數(shù)據(jù)庫(kù)基矮。

安裝MongoDB

Windows下安裝MongoDB

  • 首先到官網(wǎng)下載對(duì)應(yīng)系統(tǒng)版本的安裝包(一般裝社區(qū)版就可以了)淆储。
    軟件的安裝就不介紹了,和安裝其它程序一樣家浇。安裝之后需要將安裝目錄下的bin目錄加入系統(tǒng)環(huán)境變量Path下面(方便使用命令)本砰。如:
安裝目錄是D:\Program Files\MongoDB
  • 創(chuàng)建一個(gè)文件夾來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)和log信息以及其它文件,如:
E:\workspace\MongoDB\log\
E:\workspace\MongoDB\db\
  • MongoDB的運(yùn)行是基于服務(wù)的钢悲,所以我們先配置一下服務(wù):
    新建一個(gè)mongod.cfg文件指定log和數(shù)據(jù)庫(kù)存儲(chǔ)位置:
systemLog:
    destination: file
    path: E:\workspace\MongoDB\log\mongod.log
storage:
    dbPath: E:\workspace\MongoDB\db
  • 安裝服務(wù):
> "mongod.exe絕對(duì)路徑" --config mongod.cfg絕對(duì)路徑 --install
如:
> "D:\Program Files\MongoDB\bin\mongod.exe" --config E:\workspace\MongoDB\mongod.cfg --install
//  "mongod.exe絕對(duì)路徑" --config mongod.cfg絕對(duì)路徑 --auth --install // 連接需要用戶權(quán)限驗(yàn)證
  • 啟動(dòng)服務(wù):
> net start MongoDB
// 使用net stop MongoDB可以停止服務(wù)

現(xiàn)在就可以打開安裝目錄下bin\mongo.exe開始使用MongoDB數(shù)據(jù)庫(kù)了点额。
你也可以將這些命令創(chuàng)建一些批處理文件,方便以后使用:

Linux下安裝MongoDB(centos 7)

  • 首先到官網(wǎng)找到對(duì)應(yīng)的版本下載地址(centos 7對(duì)應(yīng)的是RHEL 7的版本):
  • 登錄服務(wù)器莺琳,使用wget命令下載:
$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.10.tgz // 下載速度真的好慢
  • 解壓安裝
$ tar -zxvf mongodb-linux-x86_64-rhel70-3.4.10.tgz  // 解壓
$ export PATH=/opt/mongodb-linux-x86_64-rhel70-3.4.10/bin/:$PATH // 添加PATH路徑(解壓路徑下的bin目錄)
  • 同樣創(chuàng)建目錄來(lái)存儲(chǔ)文件还棱,并創(chuàng)建一個(gè)配置文件mongodb.conf(參數(shù)說明):
# 設(shè)置數(shù)據(jù)文件的存放目錄
dbpath = /workspace/mongodb/db

# 設(shè)置日志文件的存放目錄及其日志文件名
logpath = /workspace/mongodb/log/mongodb.log

# 設(shè)置端口號(hào)(默認(rèn)的端口號(hào)是 27017)
port = 27017

# 設(shè)置為以守護(hù)進(jìn)程的方式運(yùn)行,即在后臺(tái)運(yùn)行
fork = true

# 關(guān)閉http接口惭等,默認(rèn)關(guān)閉27018端口訪問
nohttpinterface = true
  • 啟動(dòng)服務(wù)
$ mongod --config /workspase/mongodb/mongodb.conf
  • 打開一個(gè)客戶端鏈接
$ mongo
// > exit退出鏈接
  • 退出服務(wù)
$ mongo
> use admin
> db.shutdownServer()

至此你的MongoDB已經(jīng)跑起來(lái)珍手。

nodejs連接MongoDB

我們現(xiàn)在來(lái)使用nodejs連接MongoDB,做一個(gè)用戶注冊(cè)和顯示所有用戶的頁(yè)面。我們直接把users路由改了(也可以重新創(chuàng)建一個(gè)):

var express = require('express');
var router = express.Router();

// 數(shù)據(jù)庫(kù)
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('127.0.0.1:27017/nodetest');

/* 注冊(cè)頁(yè)面*/
router.get('/reginfo', function(req, res, next) {
    res.render('reginfo', { title: '注冊(cè)' });
});

router.post('/register', function(req, res, next) {
    // 取得post傳遞上來(lái)的參數(shù)
    var name = req.body.name;
    var password = req.body.password;
    var email = req.body.email;
    var qq = req.body.qq;
    var sex = req.body.sex;
    var content = req.body.content;

    // 插入數(shù)據(jù)庫(kù)
    db.get('users').insert({
        "name": name,
        "password": password,
        "email": email,
        "qq": qq,
        "sex": sex,
        "content": content
    }, function (err, doc) {
        // 查找已經(jīng)存在的用戶資料
        db.get('users').find({}, {}, function (e, data) {
            var r = err?"注冊(cè)失敗":"注冊(cè)成功"
            res.render('register', { title: '注冊(cè)結(jié)果', ret: r, users: data});
        });
    }); 
});

module.exports = router;

這里關(guān)鍵是引用了兩個(gè)模塊琳要,mongodb和monk寡具,我們可以從npm上下載下來(lái):

> npm install mongodb --save
> npm install monk --save

添加兩個(gè)視圖,reginfo和register:

// reginfo.ejs
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <meta charset="utf-8">
  </head>
  <body>
    <form name="form" method="post" action="register"><!--表單提交給users/register-->
  <table width="500" border="0" align="center" cellpadding="5" cellspacing="0">
    <tr align="center" bgcolor="#006699"> 
      <td height="28" colspan="2" bgcolor="#EAFFD4">注 冊(cè) 頁(yè) 面</td>
    </tr>
    <tr align="center"> 
      <td height=5></td>
    </tr>
    <tr align="center"> 
      <td width="83" align="right">昵稱:</td>
      <td width="197" align="left"><input name="name" type="text" id="name" maxlength="6">*</td> 
    </tr>
    <tr align="center"> 
      <td align="right">密碼:</td>
      <td align="left"><input name="password" type="password" id="password">*</td>
    </tr>
    <tr align="center"> 
      <td align="right">確認(rèn)密碼:</td>
      <td align="left"><input name="password2" type="password" id="password2">*</td>
    </tr>
    <tr align="center"> 
      <td align="right">郵箱:</td>
      <td align="left"><input name="email" type="text" id="email" value=""></td>
    </tr>
    <tr align="center">
      <td align="right">QQ:</td>
      <td align="left"><input name="qq" type="text" id="qq" value="">*</td>
    </tr>
    <tr align="center"> 
      <td align="right">性別:</td>
      <td align="left">
        <input name="sex" type="radio" value="1" checked>男 
        <input type="radio" name="sex" value="2">女
      </td>
    </tr>
    
    <tr align="center"> 
      <td align="right">個(gè)性簽名:</td>
      <td align="left"><textarea name="content" cols="39" rows="6" id="content">嘿嘿,多少寫一點(diǎn)吧!</textarea></td>
    </tr>
    <tr align="center"> 
      <td colspan="2"> <input name="Submit" type="submit" value="確認(rèn)注冊(cè)"> 
             
        <input type="reset" name="Submit2" value="重新輸入"> </td>  
    </tr>
  </table>
</form>
  </body>
</html>

// register.ejs
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <meta charset="utf-8">
  </head>
  <body>
    <table width="500" border="0" align="center" cellpadding="5" cellspacing="0">
    <tr><td><%=ret%></td></tr>
    <% for(var i in users){ %>
    <tr><td>·<%=users[i].name%></td></tr>
    <% } %>
    </table>
  </body>
</html>

順便也修改一下我們的主頁(yè):

// index.js
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: '主頁(yè)' });
});

module.exports = router;

// index.ejs
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>歡迎</h1>
    <p><a href="users/reginfo">注冊(cè)</a><p>
  </body>
</html>

重新啟動(dòng)我們的項(xiàng)目焙蹭,訪問:

主頁(yè)
注冊(cè)
結(jié)果

我們的小麻雀網(wǎng)站已經(jīng)建立起來(lái)啦晒杈,這系列到此就結(jié)束了,往后就看小伙伴們各自發(fā)揮了孔厉。

獲取更多的MongoDB使用說明

源碼

點(diǎn)雞下崽

添加訪問賬戶密碼

$ mongo
> use admin
> db.createUser({user:"root",pwd:"root123",roles:["root"]}) // 添加一個(gè)root類型的管理員(超級(jí)管理員拯钻,目前權(quán)限配置只能在admin數(shù)據(jù)庫(kù)下登錄),在哪個(gè)數(shù)據(jù)庫(kù)下創(chuàng)建的賬戶只能在那個(gè)數(shù)據(jù)庫(kù)下登錄撰豺。
> db.auth("root","root123") // 使用root賬戶登錄(登錄成功返回1)
// 創(chuàng)建其它數(shù)據(jù)庫(kù)的用戶(先在admin中登錄粪般,然后切換數(shù)據(jù)庫(kù))
> use testDB
> db.createUser({user:"root",pwd:"huahua123",roles:[{"role":"readWrite","db":"testDB"}]})

// 重新啟動(dòng)(需要關(guān)閉客戶端重新打開)
$ mongod --config /workspace/mongodb/mongodb.conf --auth

// 遠(yuǎn)程連接
$ mongo 遠(yuǎn)程主機(jī)ip或DNS:MongoDB端口號(hào)/數(shù)據(jù)庫(kù)名 -u user -p password
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市污桦,隨后出現(xiàn)的幾起案子亩歹,更是在濱河造成了極大的恐慌,老刑警劉巖凡橱,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件小作,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡稼钩,警方通過查閱死者的電腦和手機(jī)顾稀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坝撑,“玉大人静秆,你說我怎么就攤上這事⊙怖睿” “怎么了抚笔?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)侨拦。 經(jīng)常有香客問我殊橙,道長(zhǎng),這世上最難降的妖魔是什么阳谍? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任蛀柴,我火速辦了婚禮,結(jié)果婚禮上矫夯,老公的妹妹穿的比我還像新娘鸽疾。我一直安慰自己,他們只是感情好训貌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布制肮。 她就那樣靜靜地躺著冒窍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪豺鼻。 梳的紋絲不亂的頭發(fā)上综液,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音儒飒,去河邊找鬼谬莹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛桩了,可吹牛的內(nèi)容都是我干的附帽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼井誉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蕉扮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起颗圣,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喳钟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后在岂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奔则,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蔽午,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了应狱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祠丝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出除嘹,到底是詐尸還是另有隱情写半,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布尉咕,位于F島的核電站叠蝇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏年缎。R本人自食惡果不足惜悔捶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望单芜。 院中可真熱鬧蜕该,春花似錦、人聲如沸洲鸠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绢淀,卻和暖如春萤悴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背皆的。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工覆履, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人费薄。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓硝全,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親义锥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柳沙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)拌倍,斷路器赂鲤,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評(píng)論 6 342
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評(píng)論 25 707
  • 一、成甲老師的運(yùn)用臨界知識(shí)案例 本案例展示成甲老師如何運(yùn)用5個(gè)臨界知識(shí)打造《成甲說書》這個(gè)品牌柱恤。憑記憶與理解復(fù)述数初。...
    易查理閱讀 633評(píng)論 0 1
  • 佛說,人生有八苦: 生梗顺、老泡孩、病、死寺谤、怨憎會(huì)仑鸥、愛別離、求不得变屁、五陰熾盛眼俊。 大千世界縱有千般痛苦, 但欲海不填粟关,難知足...
    ycq苦瓜閱讀 479評(píng)論 0 0