zoukankan      html  css  js  c++  java
  • 使用TS封装操作MongoDB数据库的工具方法

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

    最后

    完整源码地址移步这里

    "你的指尖,拥有改变世界的力量! " 欢迎关注我的个人博客:https://sugarat.top
  • 相关阅读:
    我的安卓开始
    OLAP的一些知识——接下去的项目需要的背景
    关于Java接口
    Hexo+Github/Coding免费搭建个人博客网站
    手机自带输入法emoji表情的输入,提交及显示——前端解决方案
    改变函数中的 this 指向——神奇的call,apply和bind及其应用
    什么是jsonp?——使用jsonp解决跨域请求问题
    玩转angularJs——通过自定义ng-model,不仅仅只是input可以实现双向数据绑定
    利用jquery mobiscroll插件选择日期、select、treeList的具体运用
    转载:中年程序猿的迷茫,你还在深究技术吗?
  • 原文地址:https://www.cnblogs.com/roseAT/p/14775371.html
Copyright © 2011-2022 走看看