什么是MongoDB?
MongoDB是一个非关系型的数据库,它和我们之前比价属性的关系型数据库不一样,没有表和记录的概念,取而代之的是集合和对象。一个数据库包含多个集合,一个集合包含多个对象。每个对象的属性可以不同,也就是说同一个集合下一条记录包含属性a另一条记录包含属性b而没有属性a。MongoDB使用上比较随意,适合web以及物联网之类的散列数据存放,适合数据结构经常需要改变的情况,但不支持事务,不保证数据的完整性,换句话说数据并不是很可靠。MongoDB算是比较新的数据库了,据说性能很高,支持分布式存储,可以创建索引。
MongoDB并不能替代传统的关系型数据库(要求不高是可以的),典型的以空间换时间,会占用较多的磁盘空间,索引以及一些热数据会放在内存中,会占用很多内存空间,尽量不要和占内存服务放一起。
简单是说MongoDB是一个比较自由但不太靠谱(相对而言,稳定性还是有保障的)的数据库。
安装MongoDB
Windows下安装MongoDB
- 首先到官网下载对应系统版本的安装包(一般装社区版就可以了)。
软件的安装就不介绍了,和安装其它程序一样。安装之后需要将安装目录下的bin目录加入系统环境变量Path下面(方便使用命令)。如:
- 创建一个文件夹来存储数据库和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