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