之前我们学习了Mongodb 的Shell命令, 现在我们再一个小小的node项目中使用一下mongodb吧
我们先来初始化一个express项目
第一步
$ npm install express-generator -g
// 全局安装
第二步
$ express testmongodb
// 初始化一个项目
第三步
$ cd testmongodb
$ cnpm install
第四步
// 启动
$ npm start
然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了。
更改目录结构
| bin
| modle
- db.js
| config
- config.js
| views
| public
| routes
- index.js
| app.js
| package.json
完善代码阶段
$ cnpm install mongodb ---save
// 安装mongodb
// config.js
var baseUrl = "mongodb://localhost:27017";
var dbbase = "/mongodb_demo"; // 这里是我的数据库名称哦
module.exports = {
"dburl": baseUrl + dbbase
};
// db.js
/**
* 数据库封装
*
*/
var MongodbClient = require('mongodb').MongoClient
var assert = require('assert')
var config = require('../config/config.js')
/**
* 连接数据库
*/
function __connectDB(callback) {
MongodbClient.connect(config.dburl, function (err, db) {
callback(err, db)
})
}
/**
* 插入一条数据
* @param {*} collectionName 集合名
* @param {*} Datajson 写入的json数据
* @param {*} callback 回调函数
*/
function __insertOne(collectionName, Datajson, callback) {
__connectDB(function (err, db) {
var collection = db.collection(collectionName);
collection.insertOne(Datajson, function (err, result) {
callback(err, result); // 通过回调函数上传数据
db.close();
})
})
}
/**
* 查找数据
* @param {*} collectionName 集合名
* @param {*} Datajson 查询条件
* @param {*} callback 回调函数
*/
function __find(collectionName, JsonObj, callback) {
var result = [];
if (arguments.length != 3) {
callback("find函数必须传入三个参数哦", null)
return
}
__connectDB(function (err, db) {
var cursor = db.collection(collectionName).find(JsonObj);
if (!err) {
cursor.each(function (err, doc) {
assert.equal(err, null) // 使用node的assert模块来判断是否出错了
// 如果出错了,那么下面的也将不会执行了
if (doc != null) {
result.push(doc)
} else {
callback(null, result)
db.close();
}
})
}
})
}
/**
*
* 删除数据(删除满足条件的所有数据哦)
* @param {*} collectionName 集合名
* @param {*} json 查询的json数据
* @param {*} callback 回调函数
*/
function __DeleteMany(collectionName, json, callback) {
__connectDB(function (err, db) {
assert.equal(err, null)
//删除
db.collection(collectionName).deleteMany(
json,
function (err, results) {
assert.equal(err, null)
callback(err, results);
db.close(); //关闭数据库
}
);
});
}
/**
* 修改数据
* @param {*} collectionName 集合名
* @param {*} json1 查询的对象
* @param {*} json2 修改
* @param {*} callback 回调函数
*/
function __updateMany(collectionName, json1, json2, callback) {
__connectDB(function (err, db) {
assert.equal(err, null)
db.collection(collectionName).updateMany(
json1,
json2,
function (err, results) {
assert.equal(err, null)
callback(err, results)
db.close()
}
)
})
}
/**
* 获取总数
* @param {*} collectionName 集合名
* @param {*} json 查询条件
* @param {*} callback 回调函数
*/
function __getCount(collectionName, json, callback) {
__connectDB(function (err, db) {
db.collection(collectionName).count(json).then(function (count) {
callback(count)
db.close();
})
})
}
/**
* 分页查找数据
* @param {*} collectionName 集合名
* @param {*} JsonObj 查询条件
* @param {*} C 【可选】传入的参数,每页的个数、显示第几页
* @param {*} C callback
*/
function __findByPage(collectionName, JsonObj, C, D) {
var result = []; //结果数组
if (arguments.length == 3) {
//那么参数C就是callback,参数D没有传。
var callback = C;
var skipnumber = 0;
//数目限制
var limit = 0;
} else if (arguments.length == 4) {
var callback = D;
var args = C;
//应该省略的条数
var skipnumber = args.pageamount * args.page || 0;
//数目限制
var limit = args.pageamount || 0;
//排序方式
var sort = args.sort || {};
} else {
throw new Error("find函数的参数个数,必须是3个,或者4个。");
return;
}
//连接数据库,连接之后查找所有
__connectDB(function (err, db) {
var cursor = db.collection(collectionName).find(JsonObj).skip(skipnumber).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(); //关闭数据库
}
});
});
}
module.exports = {
__connectDB,
__insertOne,
__find,
__DeleteMany,
__updateMany,
__getCount,
__findByPage
}
// db.js 文件是数据库操作的DAO 层的封装
//app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
// 修改【1】
global.db = require('./modle/db.js') // 引入数据库封装好的 DAO 层方法
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
// 修改【2】 这里配置我们的路由
app.use('/', indexRouter)
app.use('/users', usersRouter)
app.use('/testconnect', indexRouter)
app.use('/testdeletemany', indexRouter)
app.use('/testupdatemany', indexRouter)
app.use('/count', indexRouter)
app.use('/testfingbypage', indexRouter)
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
// index.js
// 这里用来配置路由操作
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function (req, res, next) {
res.render('index', { title: 'Express' });
});
// 测试数据库连接
router.get('/testconnect', function (req, res) {
global.db.__connectDB(function (err, db) {
if (err) {
console.log(err)
return
}
console.log(db)
res.render('index', { title: '连接数据库成功' })
})
})
// 测试插入数据
router.get('/testinsert', function (req, res) {
global.db.__insertOne('student', {
"name": "zjj",
"age": 33,
"interests": ['play'],
"sex": "男"
}, function (err, result) {
if (!err) {
console.log(result)
res.render('index', { title: '插入一条数据成功' })
} else {
console.log(err)
}
})
})
// 查找数据
router.get('/testfind', function (req, res) {
global.db.__find('student', { age: { $lt: 30 } }, function (err, result) {
if (!err) {
console.log(result)
res.render('index', { title: '查询成功' })
} else {
console.log(err)
}
})
})
// 删除数据(删除符合条件的全部数据哦)
router.get('/testdeletemany', function (req, res) {
global.db.__DeleteMany('student', { "age": { $gte: 19 } }, function (err, result) {
if (!err) {
console.log(result)
res.render('index', { title: '删除成功' })
} else {
console.log(err)
}
})
})
// 修改数据(满足条件的数据全部都会被修改)
router.get('/testupdatemany', function (req, res) {
global.db.__updateMany(
'student',
{
"name": "zjj"
},
{
$set: { name: "cnm" }
},
function (err, result) {
if (!err) {
console.log(result)
res.render('index', {
title: '修改成功'
})
}
}
)
})
// 统计总数
router.get('/count', function (req, res) {
global.db.__getCount('student', {}, function (count) {
console.log(count)
res.render('index', {
title: `一共${count}条数据`
})
})
})
// 分页显示
// page是页数,从 0 开始
router.get('/testfingbypage', function (req, res) {
global.db.__findByPage('student', {}, {
"pageamount": 6,
"page": 0
}, function (err, result) {
if (err) {
throw err;
}
res.send(result);
console.log(result.length);
})
})
module.exports = router;
启动一次
$ npm start
打开localhost:3000
测试一下路由吧,再看看自己数据库中是否进行了相关操作了呢~
感谢支持!!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。