阅读(3759) (13)

QQ小程序 Database

2020-07-13 13:54:39 更新

Database.collection(name: string): Collection

获取集合的引用。方法接受一个 name 参数,指定需引用的集合名称。

参数

name: string 集合名称

返回值

Collection

示例代码

const cloud = require('qq-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
const todosCollection = db.collection('todos')

Database.createCollection(collectionName: string): Promise<Object>

创建集合,如果集合已经存在会创建失败

参数

collectionName: string

返回值

Promise.<Object>

属性 类型 说明
errMsg string

Database.command: Command

数据库操作符

具体接口查看 Command 文档

示例代码

const _ = db.command
db.collection('todos').doc('doc-id').update({
  data: {
    tags: _.addToSet('database')
  }
})

Database.Geo: Geo

数据库地理位置结构集

方法

Geo.Point(longitude: number, latitude: number): GeoPoint

构造一个地理位置 ”点“。方法接受两个必填参数,第一个是经度(longitude),第二个是纬度(latitude),务必注意顺序。

Database.startTransaction(): Promise<Transaction>

开始事务,另一个同样可以使用的发起事务的 API 是 runTransaction。仅可在云函数中使用。

返回值

Promise.<Transaction> resolve 的结果为事务操作对象,其上可通过 collection API 操作数据库,通过 commit 或 rollback 来结束或终止事务。

限制

事务现仅支持在云函数 qq-server-sdk 使用。事务操作时为保障效率和并发性,只允许进行单记录操作,不允许进行批量操作,但可以在一个事务中对多个记录进行操作。

示例代码

两个账户之间进行转账的简易示例

const cloud = require('qq-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database({
  throwOnNotFound: false,
})
const _ = db.command


exports.main = async (event) => {
  try {
    const transaction = await db.startTransaction()


    const aaaRes = await transaction.collection('account').doc('aaa').get()
    const bbbRes = await transaction.collection('account').doc('bbb').get()


    if (aaaRes.data && bbbRes.data) {
      const updateAAARes = await transaction.collection('account').doc('aaa').update({
        data: {
          amount: _.inc(-10)
        }
      })


      const updateBBBRes = await transaction.collection('account').doc('bbb').update({
        data: {
          amount: _.inc(10)
        }
      })


      await transaction.commit()


      console.log(`transaction succeeded`)


      return {
        success: true,
        aaaAccount: aaaRes.data.amount - 10,
      }
    } else {
      await transaction.rollback()


      return {
        success: false,
        error: `rollback`,
        rollbackCode: -100,
      }
    }
  } catch (e) {
    console.error(`transaction error`, e)


    return {
      success: false,
      error: e
    }
  }
}

Database.runTransaction(callback: function, times: number): Promise<any>

发起事务。仅可在云函数中使用。

参数

callback: function 事务执行函数,需为 async 异步函数或返回 Promise 的函数 times: number 事务执行最多次数,默认 3 次,成功后不重复执行,只有事务冲突时会重试,其他异常时不会重试

返回值

Promise.<any> resolve 的结果为 callback 事务执行函数的返回值,reject 的结果为事务执行过程中抛出的异常或者是 transaction.rollback 传入的值

事务执行函数说明

事务执行函数由开发者传入,函数接收一个参数 transaction(类型定义见 Transaction),其上提供 collection 方法和 rollback 方法。collection 方法用于取数据库集合记录引用进行操作,rollback 方法用于在不想继续执行事务时终止并回滚事务。 事务执行函数必须为 async 异步函数或返回 Promise 的函数,当事务执行函数返回时,SDK 会认为用户逻辑已完成,自动提交(commit)事务,因此务必确保用户事务逻辑完成后才在 async 异步函数中返回或 resolve Promise。 事务执行函数可能会被执行多次,在内部发现事务冲突时会自动重复执行,如果超过设定的执行次数上限,会报错退出。 在事务执行函数中发生的错误,都会认为事务执行失败而抛错。 事务执行函数返回的值会作为 runTransaction 返回的 Promise resolve 的值,在函数中抛出的异常会作为 runTransaction 返回的 Promise reject 的值,如果事务执行函数中调用了 transaction.rollback,则传入 rollback 函数的值会作为 runTransaction 返回的 Promise reject 的值。

限制

事务现仅支持在云函数 qq-server-sdk 使用。事务操作时为保障效率和并发性,只允许进行单记录操作,不允许进行批量操作,但可以在一个事务中对多个记录进行操作。

注意事项

开发者提供的事务执行函数正常返回时,SDK 会自动提交(commit)事务,请勿在事务执行函数内调用 transaction.commit 方法,该方法仅在通过 db.startTransaction 进行事务操作时使用。

示例代码

两个账户之间进行转账的简易示例

const cloud = require('qq-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database({
  throwOnNotFound: false,
})
const _ = db.command


exports.main = async (event) => {
  try {
    const result = await db.runTransaction(async transaction => {
      const aaaRes = await transaction.collection('account').doc('aaa').get()
      const bbbRes = await transaction.collection('account').doc('bbb').get()


      if (aaaRes.data && bbbRes.data) {
        const updateAAARes = await transaction.collection('account').doc('aaa').update({
          data: {
            amount: _.inc(-10)
          }
        })


        const updateBBBRes = await transaction.collection('account').doc('bbb').update({
          data: {
            amount: _.inc(10)
          }
        })


        console.log(`transaction succeeded`)


        // 会作为 runTransaction resolve 的结果返回
        return {
          aaaAccount: aaaRes.data.amount - 10,
        }
      } else {
        // 会作为 runTransaction reject 的结果出去
        await transaction.rollback(-100)
      }
    })


    return {
      success: true,
      aaaAccount: result.aaaAccount,
    }
  } catch (e) {
    console.error(`transaction error`, e)


    return {
      success: false,
      error: e
    }
  }
}

Database.RegExp(options: Object)

构造正则表达式,仅需在普通 js 正则表达式无法满足的情况下使用

参数说明

options: Object

属性 类型 默认值 必填 说明
regexp string 正则表达式字符串
options string 正则表达式模式

options 取值说明

flag 说明
i 大小写不敏感
m 跨行匹配;让开始匹配符 ^ 或结束匹配符 $ 时除了匹配字符串的开头和结尾外,还匹配行的开头和结尾

s 让 . 可以匹配包括换行符在内的所有字符

基础用法示例

// 原生 JavaScript 对象
db.collection('todos').where({
  description: /miniprogram/i
})


// 数据库正则对象
db.collection('todos').where({
  description: db.RegExp({
    regexp: 'miniprogram',
    options: 'i',
  })
})


// 用 new 构造也是可以的
db.collection('todos').where({
  description: new db.RegExp({
    regexp: 'miniprogram',
    options: 'i',
  })
})