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