Koa 操作 Mongodb 数据库
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);
Koa 操作 Mongodb 数据库的更多相关文章
- koa 基础(二十一)nodejs 操作mongodb数据库 --- 查询数据
1.app.js /** * nodejs 操作mongodb数据库 * 1.安装 操作mongodb * cnpm install mongodb --save * 2.引入 mongodb 下面的 ...
- koa 基础(二十)nodejs 操作mongodb数据库 --- 新增数据
1.app.js /** * nodejs 操作mongodb数据库 * 1.安装 操作mongodb * cnpm install mongodb --save * 2.引入 mongodb 下面的 ...
- 利用koa实现mongodb数据库的增删改查
概述 使用koa免不了要操纵数据库,现阶段流行的数据库是mongoDB,所以我研究了一下koa里面mongoDB数据库的增删改查,记录下来,供以后开发时参考,相信对其他人也有用. 源代码请看:我的gi ...
- 不使用spring的情况下原生java代码两种方式操作mongodb数据库
由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常. 主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...
- 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式
由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常. 主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...
- NodeJs连接操作MongoDB数据库
NodeJs连接操作MongoDB数据库 一,介绍 MongoDB是一种文档导向数据库管理系统,由C++撰写而成.介绍如何使用 Node.js 来连接 MongoDB,并对数据库进行操作. Mongo ...
- C# Asp.net中简单操作MongoDB数据库(二)
C# Asp.net中简单操作MongoDB数据库(一) , mongodb数据库连接可以回顾上面的篇幅. 1.model类: public class BaseEntity { /// < ...
- C# Asp.net中简单操作MongoDB数据库(一)
需要引用MongoDB.Driver.dll.MongoDB.Driver.core.dll.MongoDB.Bson.dll三个dll. 1.数据库连接: public class MongoDb ...
- PHP操作MongoDB 数据库
最近有个项目,需要用php操作mongoDb数据,整理如下 1,连接MongoDB数据库 $conn = new Mongo(); 其他链接方式 //$conn=new Mongo(); #连接本地主 ...
随机推荐
- Linux系统:保证数据安全落盘
在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据.但是我们都知道,linux系统的IO路径还是很复杂的,分为很多层,每一层都可能会有buffer来加速 ...
- 使用Mimikatz读取密码
法一: https://github.com/gentilkiwi/mimikatz/releases/tag/2.1.1-20170813 第一条:privilege::debug //提升权限 第 ...
- Ubuntu16.04 网络配置
Ubuntu 网络配置 安装Ubuntu操作系统之后,为了通过Xshell连接主机,或者连接其他主机.需要进行如下网络配置和ssh服务配置. 1 网络配置 1.1 修改网络配置信息 sudo vi / ...
- C#中多集合组合实现
C#中多集合组合使用方法,主要用到 Enumerable.Join方法 var skuInfoList = new Dictionary<int, List<long>>(); ...
- configure生成makefile的配置项说明
一般Linux软件使用configure来检测系统生成makefile文件之后可使用make来编译安装软件. configure的配置选项有哪些呢?现简单收集如下,不断更新中. 以gcc -v为例,可 ...
- Windows下安装Scipy和Numpy失败的解决方案
使用 pip 安装 Scipy 库时,经常会遇到安装失败的问题 pip install numpy pip install scipy 后来网上搜寻了一番才得以解决.scipy 库需要依赖 numpy ...
- nginx负载调度算法,后端节点状态
- [AI] 切换cuda版本的万金油
1. 环境 ubuntu16.04 GTX1080Ti x 4 nvidia-418 cuda-10.1 pytorch1.0.0 目标:在最新的显卡驱动下,使用不同版本的cuda和深度学习框架来执行 ...
- 【转】什么时候 i = i + 1 并不等于 i += 1?
增强型赋值语句是经常被使用到的,因为从各种学习渠道中,我们能够得知 i += 1 的效率往往要比 i = i + 1 更高一些(这里以 += 为例,实际上增强型赋值语句不仅限于此). 所以我们会乐此不 ...
- springmvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?
默认情况下是单例模式, 在多线程进行访问的时候,有线程安全问题. 但是不建议使用同步,因为会影响性能. 解决方案,是在控制器里面不能写成员变量. 为什么设计成单例设计模式? 1.性能(不用每次请求都创 ...