第七天 MongoDB安装使用、Express MVC

作者: 霄峰 | 来源:发表于2016-08-13 19:08 被阅读139次

    nodejs官网 https://nodejs.org
    nodejs模块 https://www.npmjs.com
    express官网 http://www.expressjs.com.cn/
    express手册 http://www.expressjs.com.cn/4x/api.html
    mongoskin 帮助 nodejs的mongodb插件 https://github.com/davidgovea/node-mongoskins
    mongoskin 帮助 http://www.hacksparrow.com/mongoskin-tutorial-with-examples.html
    express-route-controller2 express 路由控制器插件 https://www.npmjs.com/package/express-route-controller2
    数据库排名网站 http://db-engines.com/en/ranking
    MongoDB官方网站 https://www.mongodb.com/
    MongoDB帮助手册 https://docs.mongodb.com/manual/crud/
    MongoDB下载地址 https://www.mongodb.com/download-center?jmp=nav#community

    排名 数据库 存储类型 使用量
    1 Oracle Relational DBMS 1427.72
    2 MySQL Relational DBMS 1357.03
    3 Microsoft SQL Server Relational DBMS 1205.04
    4 MongoDB Document store 318.49
    5 PostgreSQL Relational DBMS 315.25
    6 DB2 Relational DBMS 185.89
    7 Cassandra Wide column store 130.24
    8 Microsoft Access Relational DBMS 124.05
    9 SQLite Relational DBMS 109.86
    10 Redis Key-value store 107.32

    1. MongoDB

    MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
    是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
    他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
    Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

    它的特点是高性能、易部署、易使用,存储数据非常方便。
    
    • 主要功能特性有:
      面向集合存储,易存储对象类型的数据
      模式自由
      支持动态查询。
      支持完全索引,包含内部对象
      支持查询
      支持复制和故障恢复
      使用高效的二进制数据存储,包括大型对象(如视频等)
      自动处理碎片,以支持云计算层次的扩展性
      支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言
      文件存储格式为BSON(一种JSON的扩展)
      可通过网络访问
    1. 安装:

    第一步 下载MongoDB

    wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.2.8.tgz
    * -c 参数 :支持断点续传
    

    第二步 解压缩、运行

    //解压缩
    tar zxvf mongodb-linux-x86_64-ubuntu1604-3.2.8.tgz
    
    //重命名
    mv mongodb-linux-x86_64-ubuntu1604-3.2.8 mongodb
    
    //切换目录
    cd mongodb
    
    //创建数据目录
    mkdir db_data
    
    //运行
    ./bin/mongod --dbpath=./db_data
    

    第三步 编写shell脚本

    vim ~/mongodb/bin/mongodb
    内容:
    #!/bin/bash
    sname="/home/scort/mongodb/bin/mongod --dbpath=/home/scort/mongodb/db_data"
    case $1 in
            start)
                    $sname &
            ;;
            stop)
                    pkill mongod
            ;;
    esac
    
    保存退出!
    
    //添加执行权限
    chmod a+x mongodb_start
    
    //运行
    //开启
    /home/scort/mongodb/bin/mongodb start
    
    //关闭
    /home/scort/mongodb/bin/mongodb stop
    
    2. 使用MongoDB(增、删、改、查)
    • 使用mongo登录mongodb系统,MongoDB的默认端口:27017
     /home/scort/mongodb/bin/mongo
    
    • 插入
    //插入一条
    db.user.insert({
      'username' : 'feng',
      'password' : 'asd0wer0324839fjfffasfansd11r3='
      })
    
    //插入多条
    db.user.insertMany([
      {
      'username' : 'feng',
      'password' : 'asd0wer0324839fjfffasfansd11r3='
      },
      {
      'username' : 'scort',
      'password' : 'asd0wer0324839asdfserqwrasdf23gwdteywe!fd'
      }
    ])
    
    * 其中user:集合名(自定义)
    
    
    • 查询
      查询集合
    db.user.find()
    db.user.find().toArray()
    db.user.find().pretty()
    

    查询当前版本号

    db.version()
    

    获取所有集合名

    db.getCollectionNames()
    show collections
    

    查看当前库

    db.getName()
    

    查看所有库

    show dbs
    

    切换库

    use teacher
    
    • 删除
    //删除user表中name为scort的用户
    db.user.remove({
      name:'scort'
      });
    
    • 更新

    update 有四个参数
    第一个:条件
    第二个:执行的操作,即修改哪些字段的值
    第三个:
    flase : 如果执行操作的字段不存在则不操作
    默认true : 如果执行操作的字段不存在则添加
    第四个:
    默认flase : 只修改匹配条件的第一条数据
    true : 修改匹配条件的所有数据

    //修改 name为scort的sex为0,只修改第一条,不存在sex字段则添加
    db.user.update(
      {name : 'feng'},
      {$set : {sex : 0}}
    );
    
    //修改所有 name为scort的sex为0,不存在则添加sex字段
    db.user.update(
      {name : 'feng'},
      {$set : {sex : 0}},
      true,
      true
    );
    
    

    2. express mvc框架

    express 是Nodejs的web框架
    express-generator是 express 应用生成器
    通过应用生成器工具express可以快速创建一个应用的骨架

    全局安装
    sudo npm install -g express-generator
    
    其中 -g 参数:全局
    
    生成blog项目
    express -e blog
    
    进入blog项目目录(以下操作都在这个目录下进行)
    cd blog
    
    安装所有依赖包
    npm install
    
    安装express-route-controller2、mongodb、mongoskin模块
    npm install express-route-controller2
    npm install mongoskin
    npm install mongodb
    
    修改app.js

    1). 在var app = express();行后面添加如下代码,来指定路由和控制器路径

    var erc2 = require('express-route-controller2');
    
    erc2(app, {
        controllers: __dirname + '/controllers',
        routes : require(__dirname+'/routes.json')
    });
    

    2). 将下面两行注释或删除

    var routes = require('./routes/index');
    var users = require('./routes/users');
    app.use('/', routes);
    app.use('/users', users);
    
    因此项目的 控制器目录是controllers;路由文件是routes.json;models目录

    1). 在项目根目录新建:

    cd ~/blog
    
    //controllers 目录
    mkdir controllers
    
    //路由routes.json 文件
    touch routes.json
    
    //models目录
    mkdir models
    

    2). 编写路由文件routes.json

    {
        "/" : "mycontroller#show",
        "/create" : {
            "get" : "mycontroller#create",
            "post" : "mycontroller#docreate"
        },
        "/delete" : "mycontroller#delete",
        "/update" : "mycontroller#update",
        "/doupdate" : {
            "post" : "mycontroller#doupdate"
        }
    }
    
    

    3). 创建controller文件

    JSON对象与字符串互转
    JSON.parse();//字符串转为JSON对象
    JSON.stringify();//JSON对象转为字符串

    vim controllers/mycontroller.js
    

    内容:

    const user = require('../models/user');
    const qs = require('querystring');
    const url = require('url');
    
    module.exports = {
        //列表查看
        show : function(req, res, next){
            user.showUser(req, res, function(err, result){
                console.log(result);
                res.render('index', {title : '用户列表', data : result});
            });
    
        },
    
        //添加页面
        create : function(req, res){
            res.render('form', {title : '添加数据'});
        },
    
        //执行添加
        docreate : function(req, res, next){
            var body = '';
            //接收参数
            req.addListener('data', (postdata) => {
                body += postdata;
            });
    
            req.addListener('end', () => {
                var data = qs.parse(body);
                console.log(data);
    
                user.insertUser(data, function(err, result){
                    console.log(result);
                    //console.log(err);
                    //res.write('insert OK !');
                    //res.end();
                    res.redirect('/');
                });
            });
        },
    
        //删除
        delete : function(req, res){
            var args=url.parse(req.url,true).query;
            console.log(args.id);
            var id = args.id;
    
            user.delete(id, function(err, result){
                console.log(err);
                console.log(result);
                res.redirect('/');
            });
        },
    
        //删除页面
        update : function(req, res){
            var args=url.parse(req.url,true).query;
            console.log(args.id);
            var id = args.id;
    
            user.getOne(id, function(err, result){
                console.log(err);
                console.log(result);
                res.render('uform', {id: id, title : '修改数据', data : result});
            });
        },
    
        //执行更新
        doupdate : function(req, res){
            var args=url.parse(req.url,true).query;
            //console.log(args.id);
            var id = args.id;
            var body = '';
            //接收参数
            req.addListener('data', (postdata) => {
                body += postdata;
            });
    
            req.addListener('end', () => {
                var data = qs.parse(body);
                //console.log(data);
    
                user.update(id, data, function(err, result){
                    console.log(result);
                    //console.log(err);
                    //res.write('insert OK !');
                    //res.end();
                    res.redirect('/');
                });
            });
        },
    }
    
    

    4). 添加module文件

    根据 _id 修改和删除
    var ObjectID = require('mongodb').ObjectID;
    {_id: ObjectID.createFromHexString(id)}

    vim modules/user.js
    

    内容:

    //mongo数据库
    var mongo = require('mongoskin');
    var db = mongo.db("mongodb://localhost:27017/xdh", {native_parser:true});
    var ObjectID = require('mongodb').ObjectID;
    
    module.exports = {
        //查询
        showUser : function(req, res, callback){
            db.bind('user');
            db.user.find().toArray(function(err, result) {
                // var result = JSON.stringify(result);
                callback(err, result);
                db.close();
            });
        },
        //插入
        insertUser : function(data, callback){
            db.bind('user');
            db.user.insert(data, function(err, result) {
                //var result = JSON.stringify(items);
                callback(err, result);
                db.close();
            });
        },
        //更新
        update : function(id, data, callback){
            db.bind('user');
            console.log(id);
            db.user.update({_id: ObjectID.createFromHexString(id)}, data, function(err, result) {
                //var result = JSON.stringify(items);
                callback(err, result);
                db.close();
            });
        },
        //删除
        delete : function(id, callback){
            db.bind('user');
            db.user.remove({_id: ObjectID.createFromHexString(id)}, function(err, result) {
                if(err) throw err;
                db.close();
                callback(err, result);
            });
        },
        //获取一条
        getOne : function(id, callback){
            db.bind('user');
            db.user.find({_id : ObjectID.createFromHexString(id)}).toArray(function(err, result) {
                // var result = JSON.stringify(result);
                callback(err, result);
                db.close();
            });
        }
    }
    
    

    5). 视图文件 index.ejs

    循环json对象
    <% for(var i in data){ %>
    <%= data[i].name %>
    <% } %>

    vim views/index.ejs
    

    内容:

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <title><%= title %></title>
        <link rel='stylesheet' href='/stylesheets/style.css' />
      </head>
      <body>
        <h1><%= title %></h1>
        <form action="/create" method="post">
        <input type="text" name="name" placeholder="姓名"/>
        <input type="text" name="age" placeholder="年龄"/>
        <button type="submit">提交</button>
        </form>
      </body>
    </html>
    
    运行项目
    npm start
    
    访问
    http://服务器IP:3000
    
    **注意:前端不使用模块引擎,后端可以使用模板引擎。**

    相关文章

      网友评论

        本文标题:第七天 MongoDB安装使用、Express MVC

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