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);

原文地址:https://www.cnblogs.com/LO-ME/p/10860154.html