使用TS封装操作MongoDB数据库的工具方法

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 使用TS封装操作MongoDB数据库的工具方法

前言


在做毕业设计过程中采用了MongoDb存储应用的日志信息,总结了一些CRUD工具方法与大家分享一下,最终使用效果可跳转到业务调用示例这一小节查看

关于MongoDb的入门教程推荐大家阅读:


菜鸟教程: MongoDB

菜鸟教程: Node.js 连接 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)
    })
}


参数:

  1. 目标的数据表名
  2. 待插入的数据
  3. 是否同时插入多个数据


查询数据


function findCollection<T>(collection: string, query: FilterQuery<T>){
    return mongoDbQuery<T[]>((db, resolve) => {
        db.collection<T>(collection).find(query).toArray().then((data) => {
            resolve(data)
        })
    })
}


参数:

  1. 目标的数据表名
  2. 查询条件


更新数据


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


参数:

  1. 目标的数据表名
  2. 查询条件
  3. 新的数据
  4. 是否批量更新


删除数据


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


最后


完整源码地址移步这里


相关文章
|
4月前
|
NoSQL MongoDB 数据库
数据库数据恢复—MongoDB数据库数据恢复案例
MongoDB数据库数据恢复环境: 一台操作系统为Windows Server的虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 工作人员在MongoDB服务仍然开启的情况下将MongoDB数据库文件拷贝到其他分区,数据复制完成后将MongoDB数据库原先所在的分区进行了格式化操作。 结果发现拷贝过去的数据无法使用。管理员又将数据拷贝回原始分区,MongoDB服务仍然无法使用,报错“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
|
4月前
|
缓存 NoSQL Linux
在CentOS 7系统中彻底移除MongoDB数据库的步骤
以上步骤完成后,MongoDB应该会从您的CentOS 7系统中被彻底移除。在执行上述操作前,请确保已经备份好所有重要数据以防丢失。这些步骤操作需要一些基本的Linux系统管理知识,若您对某一步骤不是非常清楚,请先进行必要的学习或咨询专业人士。在执行系统级操作时,推荐在实施前创建系统快照或备份,以便在出现问题时能够恢复到原先的状态。
379 79
|
3月前
|
存储 关系型数据库 MySQL
MySQL数据库中进行日期比较的多种方法介绍。
以上方法提供了灵活多样地处理和对比MySQL数据库中存储地不同格式地日子信息方式。根据实际需求选择适当方式能够有效执行所需操作并保证性能优化。
372 10
|
4月前
|
存储 NoSQL MongoDB
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
234 8
MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
|
4月前
|
SQL Oracle 关系型数据库
比较MySQL和Oracle数据库系统,特别是在进行分页查询的方法上的不同
两者的性能差异将取决于数据量大小、索引优化、查询设计以及具体版本的数据库服务器。考虑硬件资源、数据库设计和具体需求对于实现优化的分页查询至关重要。开发者和数据库管理员需要根据自身使用的具体数据库系统版本和环境,选择最合适的分页机制,并进行必要的性能调优来满足应用需求。
204 11
|
3月前
|
运维 NoSQL 容灾
告别运维噩梦:手把手教你将自建 MongoDB 平滑迁移至云数据库
程序员为何逃离自建MongoDB?扩容困难、运维复杂、高可用性差成痛点。阿里云MongoDB提供分钟级扩容、自动诊断与高可用保障,助力企业高效运维、降本增效,实现数据库“无感运维”。
|
2月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
109 3
|
2月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
2月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。

推荐镜像

更多