• Koa 操作 Mongodb 数据库


    node-mongodb-native的介绍

    使用基于官方的 node-mongodb-native 驱动,封装一个更小、更快、更灵活的 DB 模块, 让我们用 nodejs 操作 Mongodb 数据库更方便、更灵活。

    官方文档:http://mongodb.github.io/node-mongodb-native/

    node-mongodb-native的基本使用

    安装mongodb

    npm install mongodb --save

    引入mongodb下面的MongoClient

    var MongoClient = require('mongodb').MongoClient;

    定义数据库连接的地址 以及配置数据库

    var url = 'mongodb://localhost:27017/';
    var dbName = 'koa' // koa数据库的名称

    nodejs连接数据库

    MongoClient.connect(url,function(err,client){
        const db = client.db(dbName);  // 数据库db对象
    })

    操作数据库

    db.user.insert
    MongoClient.connect(url,function(err,db){
        db.collection('user').insertOne({"name":"张三"},function(err,result){
            client.close() //关闭连接
        })
    })
    var MongoClient = require('mongodb').MongoClient;
    
    var dbUrl = 'mongodb://localhost:27017/';
    var dbName = 'koa' // koa数据库的名称
    
    console.time('start1');
    
    //连接数据库
    MongoClient.connect(dbUrl,(err, client)=>{
      if(err){
        console.log(err);
        return;
      }
    
      var db = client.db(dbName);
      //查询数据
      var result = db.collection('user').find({});
      result.toArray((err,docs)=>{
        console.timeEnd('start1');
        console.log(docs);
      })
    })
    
    console.time('start2');
    // 连接数据库
    MongoClient.connect(dbUrl,(err,client)=>{
      if(err){
        console.log(err);
        return;
      }
      var db=client.db(dbName);
      //查询数据
      db.collection('user').insertOne({"name": "张三"},function(err, result){
        if(!err) {
          console.log('添加数据成功');
          client.close();
        }
      })
    })

    将操作mongodb的方法封装

    在实际的项目中我们操作数据的方法最好单独封装到一个模块里面,进行调用,不用每次都连接数据库(连接数据库很耗费时间)然后进行数据库的增删改查

    首先创建一个node应用,并且在项目中创建一个操作数据库的模块module/mongodb文件夹,里面三个文件分别是config.js(数据库配置文件),db.js(操作数据库),代码依次如下

    // 数据库配置文件
    var app = {
      dbUrl: 'mongodb://localhost:27017/',
      dbName: 'koa'
    }
    module.exports = app
    // 操作数据库
    
    var MongoClient = require('mongodb').MongoClient;
    var Config = require('./config.js');
    
    class Db {
      constructor () {
        this.dbClient = ''; // 属性 放db对象
        this.connect();   // 实例化的时候就连接数据库
      }
    
      // 单例  多次实例化实例不共享的问题
      static getInstance(){
        if(!Db.instance){
          Db.instance = new Db();
        }
        return  Db.instance;
      }
    
      // 连接数据库
      connect(){
        let _that = this;
        return new Promise((resolve,reject)=>{
          if(!_that.dbClient){ // 解决数据库多次连接的问题
            MongoClient.connect(Config.dbUrl,(err,client)=>{
              if(err){
                reject(err)
              }else{
                _that.dbClient = client.db(Config.dbName);
                resolve(_that.dbClient)
              }
            })
    
          }else{
            resolve(_that.dbClient);
          }
        })
      }
      
      // 查找数据
      find(collectionName,json){
        return new Promise((resolve,reject)=>{
          this.connect().then((db)=>{
            var result = db.collection(collectionName).find(json);
            result.toArray(function(err,docs){
              if(err){
                reject(err);
                return;
              }
              resolve(docs);
            })
          })
        })
      }
      update(collectionName,json){
        // .....
      }
      insert(collectionName,json){
        // .....
      }
    }

    在app.js中使用封装的数据库方法

    let Koa = require('koa')
    let router = require('koa-router')()
    let DB = require('./module/mongodb/db')
    
    var app = new Koa()
    
    router.get('/',async (ctx)=>{
      console.time('start首页');
      var result = await DB.find('user',{});
      console.timeEnd('start首页');
      console.log(result);
      ctx.body = result;
    })
    router.get('/news',async (ctx)=>{
      console.time('start新闻');
      var result = await DB.find('user',{});
      console.timeEnd('start新闻');
      console.log(result);
      ctx.body = result;
    })
    
    app.use(router.routes());   /*启动路由*/
    app.use(router.allowedMethods());
    app.listen(3000);

    启动服务后,浏览器运行

    操作mongodb实战DEMO

    我们来实现一个list列表的增删该查,结合实际的页面来操作mongodb数据库,首先封装操作mongodb的库

    // 数据库配置文件
    var app = {
      dbUrl: 'mongodb://localhost:27017/',
      dbName: 'koa'
    }
    module.exports = app
    var MongoClient = require('mongodb').MongoClient;
    const ObjectID = require('mongodb').ObjectID;
    
    var Config = require('./config.js');
    
    class Db {
      constructor () {
        this.dbClient = ''; // 属性 放db对象
        this.connect();   // 实例化的时候就连接数据库
      }
    
      // 单例  多次实例化实例不共享的问题
      static getInstance(){
        if(!Db.instance){
          Db.instance = new Db();
        }
        return  Db.instance;
      }
    
      // 连接数据库
      connect(){
        let _that = this;
        return new Promise((resolve,reject)=>{
          if(!_that.dbClient){ // 解决数据库多次连接的问题
            MongoClient.connect(Config.dbUrl,(err,client)=>{
              if(err){
                reject(err)
              }else{
                _that.dbClient = client.db(Config.dbName);
                resolve(_that.dbClient)
              }
            })
    
          }else{
            resolve(_that.dbClient);
          }
        })
      }
    
      // 查找数据
      find(collectionName,json){
        return new Promise((resolve,reject)=>{
          this.connect().then((db)=>{
            var result = db.collection(collectionName).find(json);
            result.toArray(function(err,docs){
              if(err){
                reject(err);
                return;
              }
              resolve(docs);
            })
          })
        })
      }
    
      // 更新数据
      update(collectionName,oldJson,newJson){
        return new Promise((resolve,reject) => {
          this.connect().then((db)=> {
            db.collection(collectionName).updateOne(oldJson,{
              $set:newJson
            }, (err,result) => {
              if(err){
                reject(err);
              }else{
                resolve(result);
              }
            })
          })
        })
      }
    
      //新增数据
      insert(collectionName,json){
        return new Promise((resolve, reject) => {
          this.connect().then((db) => {
            db.collection(collectionName).insertOne(json,(err,result) => {
              if(err){
                reject(err);
              }else{
                resolve(result);
              }
            })
          })
        })
      }
    
      // 删除数据
      remove(collectionName,json){
        return new Promise((resolve,reject) => {
          this.connect().then((db) => {
            db.collection(collectionName).removeOne(json,(err,result) => {
              if(err){
                reject(err);
              }else{
                resolve(result);
              }
            })
          })
        })
      }
    
      //mongodb里面查询 _id 把字符串转换成对象
      getObjectId(id){
        return new ObjectID(id);
      }
    }
    
    module.exports = Db.getInstance();

    然后再创建前端的页面分别有list.html,add.html,edit.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            .table{
                width:100%;
                border-collapse: collapse;
            }
            .table td,.table th{
                border: 1px solid #ccc;
                text-align: center;
            }
        </style>
    </head>
    <body>
    <br/>
    <br/>
    <a href="/add">增加用户</a>
    <br/>
    <br/>
        <table class="table">
            <tr>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
    
                <th>操作</th>
            </tr>
            {{each list}}
            <tr>
                <td>{{$value.username}}</td>
                <td>{{$value.age}}</td>
                <td>{{$value.sex}}</td>
                <td>
                    <a href="/edit?id={{@$value._id}}">编辑</a>  
                    <a href="/delete?id={{@$value._id}}">删除</a>
                </td>
            </tr>
            {{/each}}
        </table>
    </body>
    </html>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
      <title></title>
    </head>
    <body>
        <h2>用户增加</h2>
        <form action="/doAdd" method="post">
            用户名:<input type="text" name="username"/>
            <br/>
            <br/>
            年 龄:<input type="text" name="age"/>
            <br/>
            <br/>
            性别:<input type="text" name="sex"/>
            <br/>
            <br/>
            <input type="submit" value="提交"/>
        </form>
    </body>
    </html>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
            "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
      <title></title>
    </head>
    <body>
        <h2>编辑用户</h2>
        <form action="/doEdit" method="post">
            用户id:<input type="hidden" name="id" value="{{@list._id}}"/>
            用户名:<input type="text" name="username" value="{{list.username}}"/>
            <br/>
            <br/>
            年 龄:<input type="text" name="age" value="{{list.age}}"/>
            <br/>
            <br/>
            性别:<input type="text" name="sex" value="{{list.sex}}"/>
            <br/>
            <br/>
            <input type="submit" value="提交"/>
        </form>
    </body>
    </html>
    var Koa = require('koa'),
      router = require('koa-router')(),
      render = require('koa-art-template'),
      path = require('path'),
      bodyParser = require('koa-bodyparser'),
      DB = require('./module/mongodb/db.js');
    
    var app=new Koa();
    
    //配置post提交数据的中间件
    app.use(bodyParser());
    
    //配置 koa-art-template模板引擎
    render(app, {
      root: path.join(__dirname, 'views'),   // 视图的位置
      extname: '.html',  // 后缀名
      debug: process.env.NODE_ENV !== 'production'  //是否开启调试模式
    });
    
    // 首页
    router.get('/',async (ctx)=>{
      ctx.body="首页";
    })
    
    //显示列表
    router.get('/list',async (ctx)=>{
      var result=await DB.find('user',{});
      console.log(result);
      await ctx.render('list',{
        list:result
      });
    })
    
    //新增页面
    router.get('/add',async (ctx)=>{
      await ctx.render('add');
    })
    
    //执行新增操作
    router.post('/doAdd',async (ctx)=>{
      // console.log(ctx.request.body); //获取表单提交的数据
      let data = await DB.insert('user',ctx.request.body);
      try{
        if(data.result.ok){
          ctx.redirect('/list')
        }
      }catch(err){
        console.log(err);
        return;
        ctx.redirect('/add');
      }
    })
    
    //编辑页面
    router.get('/edit',async (ctx)=>{
      //通过get传过来的id来获取用户信息
      let id=ctx.query.id;
      let data=await DB.find('user',{"_id":DB.getObjectId(id)});
      //获取用户信息
      await ctx.render('edit',{
        list:data[0]
      });
    })
    
    // 执行编辑操作
    router.post('/doEdit',async (ctx)=>{
      //通过get传过来的id来获取用户信息
      //console.log(ctx.request.body);
    
      var id=ctx.request.body.id;
      var username=ctx.request.body.username;
      var age=ctx.request.body.age;
      var sex=ctx.request.body.sex;
    
      let data=await DB.update('user',{"_id":DB.getObjectId(id)},{
        username,age,sex
      })
    
      try{
        if(data.result.ok){
          ctx.redirect('/list')
        }
      }catch(err){
        console.log(err);
        return;
        ctx.redirect('/list');
      }
    })
    
    //删除学员
    router.get('/delete',async (ctx)=>{
      let id=ctx.query.id;
      var data=await DB.remove('user',{"_id":DB.getObjectId(id)});
      console.log(data);
      if(data){
        ctx.redirect('/list')
      }
    })
    
    
    app.use(router.routes());   /*启动路由*/
    app.use(router.allowedMethods());
    app.listen(3000);

  • 相关阅读:
    论文阅读 | Spatial Transformer Networks
    Latex的各种帽子
    SiamFC网络影响
    Faster RCNN Tensorflow在测试时得到的result.txt文件
    ubuntu16.04使用docker部署TFserving之安装docker
    ubuntu系统使用Faster RCNN训练自己的数据集
    pandas基础1数据结构介绍
    numpy基础4线性代数等
    numpy基础3通用函数等
    numpy基础2索引和切片
  • 原文地址:https://www.cnblogs.com/LO-ME/p/10860154.html
Copyright © 2020-2023  润新知