什么是MongoDB?
MongoDB是一個非關系型的數據庫,它和我們之前比價屬性的關系型數據庫不一樣,沒有表和記錄的概念,取而代之的是集合和對象。一個數據庫包含多個集合,一個集合包含多個對象。每個對象的屬性可以不同,也就是說同一個集合下一條記錄包含屬性a另一條記錄包含屬性b而沒有屬性a。MongoDB使用上比較隨意,適合web以及物聯網之類的散列數據存放,適合數據結構經常需要改變的情況,但不支持事務,不保證數據的完整性,換句話說數據并不是很可靠。MongoDB算是比較新的數據庫了,據說性能很高,支持分布式存儲,可以創建索引。
MongoDB并不能替代傳統的關系型數據庫(要求不高是可以的),典型的以空間換時間,會占用較多的磁盤空間,索引以及一些熱數據會放在內存中,會占用很多內存空間,盡量不要和占內存服務放一起。
簡單是說MongoDB是一個比較自由但不太靠譜(相對而言,穩定性還是有保障的)的數據庫。
安裝MongoDB
Windows下安裝MongoDB
- 首先到官網下載對應系統版本的安裝包(一般裝社區版就可以了)。
軟件的安裝就不介紹了,和安裝其它程序一樣。安裝之后需要將安裝目錄下的bin目錄加入系統環境變量Path下面(方便使用命令)。如:
安裝目錄是D:\Program Files\MongoDB
- 創建一個文件夾來存儲數據庫和log信息以及其它文件,如:
E:\workspace\MongoDB\log\
E:\workspace\MongoDB\db\
- MongoDB的運行是基于服務的,所以我們先配置一下服務:
新建一個mongod.cfg文件指定log和數據庫存儲位置:
systemLog:
destination: file
path: E:\workspace\MongoDB\log\mongod.log
storage:
dbPath: E:\workspace\MongoDB\db
- 安裝服務:
> "mongod.exe絕對路徑" --config mongod.cfg絕對路徑 --install
如:
> "D:\Program Files\MongoDB\bin\mongod.exe" --config E:\workspace\MongoDB\mongod.cfg --install
// "mongod.exe絕對路徑" --config mongod.cfg絕對路徑 --auth --install // 連接需要用戶權限驗證
- 啟動服務:
> net start MongoDB
// 使用net stop MongoDB可以停止服務
現在就可以打開安裝目錄下bin\mongo.exe開始使用MongoDB數據庫了。
你也可以將這些命令創建一些批處理文件,方便以后使用:
Linux下安裝MongoDB(centos 7)
- 首先到官網找到對應的版本下載地址(centos 7對應的是RHEL 7的版本):
- 登錄服務器,使用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目錄)
- 同樣創建目錄來存儲文件,并創建一個配置文件mongodb.conf(參數說明):
# 設置數據文件的存放目錄
dbpath = /workspace/mongodb/db
# 設置日志文件的存放目錄及其日志文件名
logpath = /workspace/mongodb/log/mongodb.log
# 設置端口號(默認的端口號是 27017)
port = 27017
# 設置為以守護進程的方式運行,即在后臺運行
fork = true
# 關閉http接口,默認關閉27018端口訪問
nohttpinterface = true
- 啟動服務
$ mongod --config /workspase/mongodb/mongodb.conf
- 打開一個客戶端鏈接
$ mongo
// > exit退出鏈接
- 退出服務
$ mongo
> use admin
> db.shutdownServer()
至此你的MongoDB已經跑起來。
nodejs連接MongoDB
我們現在來使用nodejs連接MongoDB,做一個用戶注冊和顯示所有用戶的頁面。我們直接把users路由改了(也可以重新創建一個):
var express = require('express');
var router = express.Router();
// 數據庫
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('127.0.0.1:27017/nodetest');
/* 注冊頁面*/
router.get('/reginfo', function(req, res, next) {
res.render('reginfo', { title: '注冊' });
});
router.post('/register', function(req, res, next) {
// 取得post傳遞上來的參數
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;
// 插入數據庫
db.get('users').insert({
"name": name,
"password": password,
"email": email,
"qq": qq,
"sex": sex,
"content": content
}, function (err, doc) {
// 查找已經存在的用戶資料
db.get('users').find({}, {}, function (e, data) {
var r = err?"注冊失敗":"注冊成功"
res.render('register', { title: '注冊結果', ret: r, users: data});
});
});
});
module.exports = router;
這里關鍵是引用了兩個模塊,mongodb和monk,我們可以從npm上下載下來:
> npm install mongodb --save
> npm install monk --save
添加兩個視圖,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">注 冊 頁 面</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">確認密碼:</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">個性簽名:</td>
<td align="left"><textarea name="content" cols="39" rows="6" id="content">嘿嘿,多少寫一點吧!</textarea></td>
</tr>
<tr align="center">
<td colspan="2"> <input name="Submit" type="submit" value="確認注冊">
<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>
順便也修改一下我們的主頁:
// index.js
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: '主頁' });
});
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">注冊</a><p>
</body>
</html>
重新啟動我們的項目,訪問:
主頁
注冊
結果
我們的小麻雀網站已經建立起來啦,這系列到此就結束了,往后就看小伙伴們各自發揮了。
源碼
添加訪問賬戶密碼
$ mongo
> use admin
> db.createUser({user:"root",pwd:"root123",roles:["root"]}) // 添加一個root類型的管理員(超級管理員,目前權限配置只能在admin數據庫下登錄),在哪個數據庫下創建的賬戶只能在那個數據庫下登錄。
> db.auth("root","root123") // 使用root賬戶登錄(登錄成功返回1)
// 創建其它數據庫的用戶(先在admin中登錄,然后切換數據庫)
> use testDB
> db.createUser({user:"root",pwd:"huahua123",roles:[{"role":"readWrite","db":"testDB"}]})
// 重新啟動(需要關閉客戶端重新打開)
$ mongod --config /workspace/mongodb/mongodb.conf --auth
// 遠程連接
$ mongo 遠程主機ip或DNS:MongoDB端口號/數據庫名 -u user -p password