使用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 })
}
最后
完整源码地址移步这里
"你的指尖,拥有改变世界的力量! "
欢迎关注我的个人博客:https://sugarat.top
分类:
开发/学习笔记
, javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2019-05-16 Spring MVC中获取当前项目的路径
2019-05-16 解决Spring MVC无法接收AJAX使用PUT与DELETE请求传输的内容