使用TS封装操作MongoDB数据库的工具方法
使用TS封装操作MongoDB数据库的工具方法
前言
在做毕业设计过程中采用了MongoDb存储应用的日志信息,总结了一些CRUD方法与大家分享一下,最终使用效果可跳转到业务调用示例这一小节查看
关于MongoDb的入门教程推荐大家阅读:
获取数据库链接
const {
host, port, user, password, database,
} = mongodbConfig
const url = `mongodb://${user}:${password}@${host}:${port}/${database}`
// 如果没有设置账号与密码,可以省略
// const url = `mongodb://${host}:${port}/${database}`
interface Res {
db: MongoClient
Db: Db
}
function getDBConnection(): Promise<Res> {
return new Promise((res, rej) => {
MongoClient.connect(url, {
useUnifiedTopology: true,
useNewUrlParser: true,
}).then((db) => {
res({
db,
Db: db.db(database),
})
}).catch((err) => {
rej(err)
})
})
}
使用Promise对其进行包装,返回db(连接实例)与DB(数据库实例)
包装数据库查询方法
// 传入的回调函数类型定义
type Callback<T> = (db: Db, resolve: (value: T | PromiseLike<T>) => void) => void
export function query<T>(callback: Callback<T>): Promise<T> {
const p = new Promise<T>((resolve, rej) => {
getDBConnection().then(({ db, Db }) => {
// 执行回调
callback(Db, resolve)
// resolve后关闭
p.catch((e) => rej(e))
.finally(() => {
db.close()
})
})
})
return p
}
获取到链接实例,由调用方传入需要执行的回调函数,在执行resolve后自动通过finally中的回调断开数据库的链接
CRUD
插入数据
function insertCollection<T>(collection: string, data: T[] | T, many = false){
return mongoDbQuery<InsertOneWriteOpResult<WithId<T>>>((db, resolve) => {
if (many && Array.isArray(data)) {
db.collection<T>(collection).insertMany(data as any).then(resolve as any)
return
}
db.collection<T>(collection).insertOne(data as any).then(resolve)
})
}
参数:
- 目标的数据表名
- 待插入的数据
- 是否同时插入多个数据
查询数据
function findCollection<T>(collection: string, query: FilterQuery<T>){
return mongoDbQuery<T[]>((db, resolve) => {
db.collection<T>(collection).find(query).toArray().then((data) => {
resolve(data)
})
})
}
参数:
- 目标的数据表名
- 查询条件
更新数据
function updateCollection<T>(collection: string, query: FilterQuery<T>, data: UpdateQuery<T> | Partial<T>, many = false){
return mongoDbQuery<UpdateWriteOpResult>((db, resolve) => {
if (many) {
db.collection<T>(collection).updateMany(query, data).then(resolve)
return
}
db.collection<T>(collection).updateOne(query, data).then(resolve)
})
}
参数:
- 目标的数据表名
- 查询条件
- 新的数据
- 是否批量更新
删除数据
function deleteCollection<T>(collection: string, query: FilterQuery<T>, many = false) {
return mongoDbQuery<DeleteWriteOpResultObject>((db, resolve) => {
if (many) {
db.collection(collection).deleteMany(query).then(resolve)
return
}
db.collection(collection).deleteOne(query).then(resolve)
})
}
业务调用示例
方法封装好后,业务调用就很简单明了与语义化了,跟直接在mongoDB Shell中写指令一样顺手
function addUser(userId: string, options = {}) {
const defaultOptions = {
nickname: '随机',
gender: Gender.MALE,
lastLogin: new Date(),
loginCount: 0,
avatar: '/static/logo.png',
}
const ops = Object.assign(defaultOptions, options)
return insertCollection('user', { userId, ...ops })
}
function findUser(user:User) {
return findCollection<User>('user', user)
}
function updateUserInfo(userId: string, info: User) {
return updateCollection<User>('user', {
userId,
}, {
$set: info,
})
}
function deleteUser(userId: number) {
return deleteCollection<User>('user', { id: userId })
}
最后
完整源码地址移步这里
使用TS封装操作MongoDB数据库的工具方法的更多相关文章
- NodeJS操作MongoDB数据库
一.node.js对于mongodb的基本操作 1.数据库的开机 首先我们要先对数据库进行开机的操作,建立一个文件夹用于存放数据库文档.如D:\mongo,接下去在cmd当中键入命令-> mon ...
- NodeJs连接操作MongoDB数据库
NodeJs连接操作MongoDB数据库 一,介绍 MongoDB是一种文档导向数据库管理系统,由C++撰写而成.介绍如何使用 Node.js 来连接 MongoDB,并对数据库进行操作. Mongo ...
- mongoose之操作mongoDB数据库
mongoose是node.js操作mongoDB数据库的一种工具,借助于mongoose,我们可以便捷的完成一些数据库的基本操作,基本使用如下: 1.安装 npm install mongoose ...
- Koa 操作 Mongodb 数据库
node-mongodb-native的介绍 使用基于官方的 node-mongodb-native 驱动,封装一个更小.更快.更灵活的 DB 模块, 让我们用 nodejs 操作 Mongodb 数 ...
- MongoDB学习【四】—pymongo操作mongodb数据库
一.pymongodb的安装 Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接. pip安装 pip 是一个通用的 Python 包管理工具, ...
- 不使用spring的情况下原生java代码两种方式操作mongodb数据库
由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常. 主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...
- 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式
由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常. 主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...
- 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(); #连接本地主 ...
随机推荐
- <semaphore.h> 和 <sys/sem.h> 的区别
<sys/sem.h>为 XSI(最初是 Unix System V)信号量提供接口. 这些不是基本 POSIX 标准的一部分(它们在 XSI 选项中,主要是为了传统的 Unix 兼容性) ...
- 内存泄漏定位工具之 mtrace(一)
1 前言 mtrace(memory trace),是 GNU Glibc 自带的内存问题检测工具,它可以用来协助定位内存泄露问题.它的实现源码在glibc源码的malloc目录下,其基本设计原理为设 ...
- delphi 官方例子 simples 路径
公用 文件件 可能是隐藏的 若是的话 则显示 隐藏
- .NET Core开发实战(第35课:MediatR:让领域事件处理更加优雅)--学习笔记
35 | MediatR:让领域事件处理更加优雅 核心对象 IMediator INotification INotificationHandler 这两个与之前的 Request 的行为是不一样的, ...
- MySQL优化技术系列-谓词下推(pushdown)
谓词下推 将外层查询块的 WHERE 子句中的谓词移入所包含的较低层查询块(例如视图),从而能够提早进行数据过滤以及有可能更好地利用索引. 这在分区数据库环境中甚至更为重要,其原因在于,提早进行过滤有 ...
- NC16681 [NOIP2003]加分二叉树
题目链接 题目 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tr ...
- 轻松玩转Makefile | 企业项目级Makefile实例
前言 本文展示了一个比较完整的企业项目级别的Makefile文件,包括了:文件调用,源文件.头文件.库文件指定,软件版本号.宏定义,编译时间,自动目录等内容. 1.目录架构 本文中所采用的目录架构,在 ...
- React虚拟DOM的理解
React虚拟DOM的理解 Virtual DOM是一棵以JavaScript对象作为基础的树,每一个节点可以将其称为VNode,用对象属性来描述节点,实际上它是一层对真实DOM的抽象,最终可以通过渲 ...
- java类初始化及代码块加载顺序连根拔起
说明 相信很多人对于java中父子继承关系中,子类实例化调用过程中,代码块的执行顺序都容易忘记或搞混,尤其是java初级笔试题或面试题最容易出这类题目,让人恨得牙痒痒!!! 本文就一次性将其连根铲除, ...
- pikachu sql inject 时间盲注
输入框输入任何消息返回内容都是一样的 那么可以考虑插入sleep函数来观察响应时长来判断是否有注入点 输入 kobe' and sleep(3) # 发现页面缓冲3秒才响应,说明确实是注入点 通过if ...