Koa 操做 Mongodb 數據庫

node-mongodb-native的介紹html

使用基於官方的 node-mongodb-native 驅動,封裝一個更小、更快、更靈活的 DB 模塊, 讓咱們用 nodejs 操做 Mongodb 數據庫更方便、更靈活。前端

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

 

 

node-mongodb-native的基本使用git

安裝mongodbgithub

npm install mongodb --save

引入mongodb下面的MongoClientmongodb

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

定義數據庫鏈接的地址 以及配置數據庫數據庫

var url = 'mongodb://localhost:27017/';
var dbName = 'koa' // koa數據庫的名稱

nodejs鏈接數據庫npm

MongoClient.connect(url,function(err,client){
    const db = client.db(dbName);  // 數據庫db對象
})

操做數據庫json

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

相關文章
相關標籤/搜索