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

作者: 云华兄 | 来源:发表于2017-10-27 10:52 被阅读221次

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

    相关文章

      网友评论

        本文标题:Node.js从白痴到入门(五):MongoDB

        本文链接:https://www.haomeiwen.com/subject/gcskpxtx.html