什么是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下面(方便使用命令)本砰。如:
- 創(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)目焙蹭,訪問:
我們的小麻雀網(wǎng)站已經(jīng)建立起來(lái)啦晒杈,這系列到此就結(jié)束了,往后就看小伙伴們各自發(fā)揮了孔厉。
源碼
添加訪問賬戶密碼
$ 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