Node.js从白痴到入门(五):MongoDB

什么是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>

重新启动我们的项目,访问:

主页
注册
结果

我们的小麻雀网站已经建立起来啦,这系列到此就结束了,往后就看小伙伴们各自发挥了。

获取更多的MongoDB使用说明

源码

点鸡下崽

添加访问账户密码

$ 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,367评论 6 343
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 一、成甲老师的运用临界知识案例 本案例展示成甲老师如何运用5个临界知识打造《成甲说书》这个品牌。凭记忆与理解复述。...
    易查理阅读 600评论 0 1
  • 佛说,人生有八苦: 生、老、病、死、怨憎会、爱别离、求不得、五阴炽盛。 大千世界纵有千般痛苦, 但欲海不填,难知足...
    ycq苦瓜阅读 441评论 0 0