传统的写法
/**
* Created by 黄森 on 2017/7/22.
*/
var express = require('express');
var app = express();
var MongoClient = require('mongodb').MongoClient;
app.get('/',function (req,res) {
// Connection URL
var url = 'mongodb://localhost:27017/database';
MongoClient.connect(url, function(err, db) {
if(err){
console.log("数据库连接失败")
}
console.log("数据库连接成功");
//插入数据
db.collection('student').insertOne({
"name":"hahah",
"age":"100"
},function (err,result) {
console.log(result);
res.send("插入数据成功:"+result);
db.close();
});
});
});
app.listen(3000);
这样的话,我们可以看出用户在每次操作的时候,就要连接依次数据库,这样的话效率很低,所以我们把数据库的增删改查封装成一个 模块,这个模块命名为db.js
Dao层封装:db.js
1、引入mongodb
var MongoClient = require('mongodb').MongoClient;
2、连接数据库
//连接数据路
function _connectDB(callback) {
// Connection URL
var url = 'mongodb://localhost:27017/database';
MongoClient.connect(url, function (err, db) {
console.log("数据库连接成功");
if(err){
callback(err,null);
return;
}
callback(err, db);
});
}
3、封装方法
- 插入数据
// 插入数据
exports.insertOne = function (collectionName, json, callback) {
_connectDB(function (err, db) {
db.collection(collectionName).insertOne(json, function (err, result) {
callback(err, result);
db.close();
})
})
};
- 查找数据
// 查找数据
exports.find = function (collectionName, json, callback) {
var result = []; //返回结果的数组
if (arguments.length != 3) {
callback("find接受三个参数", null);
return;
}
_connectDB(function (err, db) {
var cursor = db.collection(collectionName).find(json);
cursor.each(function (err, doc) {
if (err) {
callback(err, null);
db.close();
return;
}
if (doc != null) {
result.push(doc); //放入结果数组中
} else {
//没有结果
callback(null, result);
db.close();
}
})
})
};
- 分页查询
mongo在分页查询的时候是db.student.find().skip().limit();
find()
就是查找的条件,skip()
就是略过的条数,limit()
就是读取的条数,limit
和skip
配合使用就是分页查询。
数据总数两种写法:
db.student.find().count()
db.student.stats().count;
比如:第一页是page=0。每页10条,所以当前页的查询语句:
db.student.find({}).limit(10).skip(page*10)
所以分页查询封装好的函数就是如下所示:
// 查找数据,args是一个对象{"pageamount":2,"page":page}
exports.find = function (collectionName, json, C,D) {
var result = []; //返回结果的数组
if (arguments.length == 3) {
var callback = C;
var skip = 0;
var limit = 0;
}else if(arguments.length==4){
var callback = D;
var args = C;
//应该省略的条数
var skip = args.pageamount*args.page||0;
//数目限制数
var limit = args.pageamount||0;
// 排序
var sort = args.sort||{}
}else{
throw new Error("find函数的参数必须是三个或四个");
return;
}
_connectDB(function (err, db) {
var cursor = db.collection(collectionName).find(json).skip(skip).limit(limit).sort(sort);
cursor.each(function (err, doc) {
if (err) {
callback(err, null);
db.close();
return;
}
if (doc != null) {
result.push(doc); //放入结果数组中
} else {
//没有结果
callback(null, result);
db.close();
}
})
})
};
去调用的时候就是:
app.get("/find",function (req,res) {
var page =parseInt(req.query.page);
db.find("student",{},{"pageamount":2,"page":page},{"sort":{"shijian":-1}},function (err,result) {
if(err){
console.log("查找失败")
}
res.send(result);
})
});
- 修改数据
//修改
exports.updateMany = function (collectionName, json1, json2, callback) {
_connectDB(function (err, db) {
db.collection(collectionName).updateMany(
json1,
json2,
function (err, results) {
callback(err, results);
db.close();
});
})
};
- 删除数据
// 删除
exports.deleteMany = function (collectionName, json, callback) {
_connectDB(function (err, db) {
db.collection(collectionName).deleteMany(json, function (err, result) {
callback(result.length);
db.close();
})
})
};