koa mysql mongodb_koa 操作MongoDB数据库

安装

安装MongoDB

npm install mongodb --save

引入中间件

引入mongodb下面的连接模块MongoClient

// 引入MongoDB 连接模块

const MongoClient = MongoDB.MongoClient;

配置中间件

定义数据库连接的地址以及配置数据库的名称

let url = "mongodb://localhost:27017/";

let dbName = "koa";

连接数据库

nodejs连接数据库

MongoClient.connect(url,(err,client)=>{

if(err){

console.log(err);

return false;

}

let db = client.db(dbName); //数据库db对象

});

操作数据库

MongoClient.connect(url,(err,client)=>{

if(err){

console.log(err);

return false;

}

let db = client.db(dbName); //数据库db对象

db.collection('user').insertOne({'name':'张三'}, function(err, result){

if(!err){

console.log('数据增加成功');

clinet.close(); //关闭连接

}

});

let cx = db.collection('user').find({});

cx.toArray((err,docs)=>{

console.log(docs);

});

});

封装MongoDB库,优化【连接数据库】和【操作数据库】操作

最终会有两个文件,一个是 MongoDB配置文件MongoDB.config.js和一个是MongoDB封装文件MongoDB.db.js。

MongoDB.config.js文件:

// MongoDB数据库配置文件

const app = {

// 定义数据库地址

'dbUrl' : 'mongodb://localhost:27017/',

// 定义数据库名字

'dbName' : 'koa'

};

module.exports = app;

MongoDB.db.js文件:

/*

封装DB库操作

*/

// 引入MongoDB 模块

const MongoDB = require("mongodb");

// 引入MongoDB 连接模块

const MongoClient = MongoDB.MongoClient;

// 引入MongoDB ObjectID模块

const ObjectID = MongoDB.ObjectID;

// 引入配置文件

const Config = require("./MongoDB.config.js");

class Db {

// 单例模式,解决多次实例化时候每次创建连接对象不共享的问题,实现共享连接数据库状态

static getInstance() {

if (!Db.instance) {

Db.instance = new Db();

}

return Db.instance;

}

constructor() {

// 属性 存放db对象

this.dbClient = "";

// 实例化的时候就连接数据库,增加连接数据库速度

this.connect();

}

// 连接数据库

connect() {

return new Promise((resolve, reject) => {

// 解决数据库多次连接的问题,要不然每次操作数据都会进行一次连接数据库的操作,比较慢

if (!this.dbClient) {

// 第一次的时候连接数据库

MongoClient.connect(Config.dbUrl, (err, client) => {

if (err) {

reject(err);

} else {

// 将连接数据库的状态赋值给属性,保持长连接状态

this.dbClient = client.db(Config.dbName);

resolve(this.dbClient);

}

});

} else {

// 第二次之后直接返回dbClient

resolve(this.dbClient);

}

});

}

/**

* 查询数据库

* 使用方法: let result = await DB.find('user',{});

* @param {String} collectionName 集合名称、数据表名

* @param {Object} json 查询的条件

*/

find(collectionName, json) {

return new Promise((resolve, reject) => {

this.connect().then((db) => {

// 操作db库里的某一个表,返回符合条件的内容,json查找的条件

let result = db.collection(collectionName).find(json);

result.toArray(function (err, docs) {

if (err) {

reject(err);

return;

}

resolve(docs);

});

});

});

}

/**

* 更新数据库

* 使用方法: let result = await DB.update('user',{'username':'lisi'},{'username':'李四'});

* @param {String} collectionName 集合名称、数据表名

* @param {Object} json1 需要更新数据的条件

* @param {Object} json2 新数据的内容

*/

update(collectionName, json1, json2) {

return new Promise((resolve, reject) => {

this.connect().then((db) => {

// 操作db库里的某一个表,更新一条数据,json1查找的内容,json2更新的新内容,回调函数

db.collection(collectionName).updateOne(

json1,

{

$set: json2,

},

(err, result) => {

if (err) {

reject(err);

} else {

resolve(result);

}

}

);

});

});

}

/**

* 插入数据库

* 使用方法: let result = await DB.insert('user',{'username':'赵六666','age':30,'sex':'女','status':'2'});

* @param {String} collectionName 集合名称、数据表名

* @param {Object} json 插入的新数据

*/

insert(collectionName, json) {

return new Promise((resolve, reject) => {

this.connect().then((db) => {

// 操作db库里的某一个表,插入一条数据,json插入的新内容,回调函数

db.collection(collectionName).insertOne(json, (err, result) => {

if (err) {

reject(err);

} else {

resolve(result);

}

});

});

});

}

/**

* 批量插入数据库

* 使用方法: let result = await DB.insert('user',[{'username':'赵六666','age':30,'sex':'女','status':'2'},{'username':'赵六666','age':30,'sex':'女','status':'2'},{'username':'赵六666','age':30,'sex':'女','status':'2'}...]);

* @param {String} collectionName 集合名称、数据表名

* @param {Array} json 批量插入的新数据

*/

insertMany(collectionName, arr) {

return new Promise((resolve, reject) => {

this.connect().then((db) => {

// 操作db库里的某一个表,批量插入一组数据,arr批量插入的新内容,回调函数

db.collection(collectionName).insertMany(arr, (err, result) => {

if (err) {

reject(err);

} else {

resolve(result);

}

});

});

});

}

/**

* 删除数据

* 使用方法: let result = await DB.remove('user',{'username':'李四'});

* @param {String} collectionName 集合名称、数据表名

* @param {Object} json 删除数据的条件

*/

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

}

});

});

});

}

/**

* 通过id查询数据时候需要用到此方法,MongoDB里面查询_id ,把字符串转换成对象

* MongoDB数据库里的_id是自动生成的,通过dind方法查询结果可以看到形式如: {"_id": ObjectId("5aad299bc166236421c99d229")},直接传入5aad299bc166236421c99d229,是查询不到结果的,所以需要包装一下

* 使用方法: let result = await DB.find('user',{'_id': DB.getObjectID(xxxxx)});

* @param {String} id 要查询的id

*/

getObjectID(id) {

return new ObjectID(id);

}

}

module.exports = Db.getInstance();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 64位 安装1045_MySql 安装时的1045错误

MySql 安装到最后一步遇到1045错误Access denied for user rootlocalhost (usingpassword:YES)解决方案一:卸载MySQL,重新安装1, 卸载MySQL2, 删除目录 C:\Documents and Settings\All Users\ApplicationData\MySQL,还要删除MySQL安装目录3, 重新安装MyS…

mysql工作表格制作教程_Access制作复杂报表

何制作复杂报表利用excel输出复杂报表 在读这篇文章以前首先要提醒大家,Access 本身的报表也具有很强的实用性和强大的功能,只有当你发掘了其本身全部的功能却仍不能满足你对报表的特殊要求时才请使用 Excel 输出报表。很明显,使用 Excel 输出…

php+mysql投票代码_PHP+jQuery+MySql实现红蓝投票功能

本文是一篇综合知识应用类文章,需要您具备PHP、jQuery、MySQL以及html和css方面的基本知识。本文在《PHPMySqljQuery实现的“顶”和“踩”投票功能》一文基础上做了适当改进,共用了数据表,您可以先点击了解这篇文章。HTML我们需要在页面中展示…

numpy 最大值_第 85 天:NumPy 统计函数

数学统计在我们的程序当中特别是数据分析当中是必不可少的一部分,本文就来介绍一下 NumPy 常见的统计函数。最大值与最小值numpy.amin()用于计算数组中的元素沿指定轴的最小值。可以通过 axis 参数传入坐标轴来指定统计的轴,当指定 axis 时,a…

java中如何实现变量可配置_Java基础-如何配置环境变量

Java环境变量详细教程第一步、打开电脑环境变量设置窗口以Win10系统为例子。在桌面找到此电脑,右键此电脑— —>属性,点击属性— —>点击左侧高级系统设置点击高级系统设置点击环境变量第二步、新建JAVA_HOME点击系统变量中的新建,出现输入框&…

python三引号解析_[宜配屋]听图阁

和C语言一样,引号属于特殊功能字符,不能够像普通字符那样直接通过print打印,需要进行一些处理,比如说反斜杠转义等。这里介绍几种打印三引号的方法,希望对需要的朋友有用。1、第一中方法比较简单,直接使用三…

abaqus python 建立节点集合_在Python中创建Abaqus集

我想用Python在Abaqus中创建一个带边的几何集。我不会事先知道边的数目。尝试将边放入数组中,然后创建集合。你知道吗myEdgesForSet []for i in range(0, len(mdb.models[Model].parts[Part].edges)):if something in mdb.models[Model].parts[Part].edges[i].feat…

java类默认访问权限_Java的四种访问权限

❝ 所谓访问权限,指的就是本类中的成员变量、成员方法对其他类的可见性❞试想一想,当我们修改一个非常庞大的项目时,如果所有变量和方法都是公共权限,那么后端中任何类都有权限去修改它的变量和方法,很有可能修改后就导…

java 数组 反射_【译】10. Java反射——数组

用Java反射来处理数组有时候是技巧性很强的。特别是如果你需要获取一个给定类型的数组的Class对象,像int[ ]等。本文将讲述怎么用Java反射来创建数组和获取数组的Class对象。下面是所涵盖的主题列表:java.lang.reflect.ArrayCreating ArraysAccessing Ar…

定时执行java程序_如何让Java程序定时运行

由于项目开发的需要,必须实现让一个Java程序定时运行。比如,我的项目中,有一个网络蜘蛛,需要从互联网上抓取数据,与其配合,有另一个程序来对新抓取的页面进行索引的创建,由于数据源更新频率不高…

java递归实现排序_快速排序算法原理及java递归实现

快速排序 对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序。使用的是递归原理,在所有同数量级O(n longn) 的排序方法中,其平均性能最好。就平均时间而言,是目前被认为最好的一种内部排序方…

java 泛型 .net_Java泛型

标签:上一篇博文java8函数式编程--收集器collector:(http://my.oschina.net/joshuashaw/blog/487322)讲得比较随性,并没有把源码一句一句拿出来分析,后来发现groupingBy方法最后有一个if-else分支用来返回不同类型的collector&…

卡法电子商务 java_javacard DES算法API使用示例

********** 2017年3月15日留言 ——关于java卡Applet系列csdn博文 *************貌似有不少人在看我写的几篇关于java卡applet的博文,也收到了一些评论指正博文错误,或者私信叫我发代码文件过去。在此需要说明的是,java卡applet的这几篇博文…

java http请求原理_浅谈Spring Cloud zuul http请求转发原理

spring cloud 网关,依赖于netflix 下的zuul 组件zuul 的流程是,自定义 了ZuulServletFilter和zuulServlet两种方式,让开发者可以去实现,并调用先来看下ZuulServletFilter的实现片段Overridepublic void doFilter(ServletRequest s…

java堆外内存溢出_JVM 案例 - 堆外内存导致的溢出错误

案例一个网站为了实现客户端实时从服务端接收数据,使用了 CometD 1.1.1 作为服务端推送框架,服务器是 Jetty7.1.4,CPU i5,内存 4G,操作系统 32位Windows。服务端常常抛出内存溢出异常,管理员把堆开到最大(3…

java mail outlook_已启用Outlook API邮件与邮箱用户

一个非常微妙的问题,也许是特定的环境 . 我正在尝试使用Outlook 2010 API从启用邮件的用户中识别邮箱用户 . 我们在Notes to Exchange迁移期间使用Dell Quest迁移工具,它是一个流动的项目 . 仍处于原型阶段,因此使用VB宏来最终将在C&#xff…

oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...

java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)oracle中procedure是不能有返回值的,要想返回值,就得有输出参数,同样要想返回记录集,可以把游标类型作为输出参数。下面是详细情况说明&am…

mysql dump工具升级_MySQL数据库升级

当前不少系统的数据库依旧是MySQL5.6,由于MySQL5.7及MySQL8.0在性能及安全方面有着很大的提升,因此需要升级数据库。本文通过逻辑方式、物理方式原地升级来介绍MySQL5.6 升级至MySQL5.7的方法,并介绍其使用场景。1. 逻辑方式升级逻辑方式升级…

java int 128 ==_为什么 Java Integer 中“128==128”为false,而”100==100“为true?

这是一个挺有意思的讨论话题,让我们用代码说话吧!运行下面的代码:Integer a 128, b 128;System.out.println(a b);Integer c 100, d 100;System.out.println(c d);你会得到:falsetrue基本知识:我们知道,如果两个引用指向同一个对象&…

mysql课程表学时_Mysql 巩固提升 (学生表_课程表_成绩表_教师表)

方便Mysql 巩固提升创建表并插入数据:-- ------------------------------ Table structure for student-- ----------------------------DROP TABLE IF EXISTS student;CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,sname varchar(32) DEFAULT NULL,s…