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