数据表

数据存储是知晓云提供的核心功能之一,借助它,你可以省去自己搭建数据库,维护数据库及优化数据库查询等麻烦操作。通过以下操作,便可以向在控制台创建的数据表添加一条记录:

要操作数据表,需要借助 TableObject 对象,每个 TableObject 实例对应一张数据表,通过 TableObject 实例,你可以对数据表进行增删改查的操作。

当我们需要创建一行新的数据时,使用 create() 方法, 该方法无需传入参数,create() 方法 返回值为 BaaS.TableRecord 对象。

通过 TableRecord 实例的 setsave 方法,可以完成数据行的创建。

  1. let tableName = 'product'
  2. // 通过 `tableName` 实例化一个 `TableObject` 对象,操作该对象即相当于操作对应的数据表
  3. let Product = new wx.BaaS.TableObject(tableName)
  4. // 本地创建一条空记录
  5. let product = Product.create() // product 为 TableRecord 实例
  6. let apple = {
  7. name: 'apple',
  8. price: 1,
  9. desc: ['good'],
  10. amount: 0
  11. }
  12. // 为上面创建的空记录赋值,并保存到服务器,save() 方法返回一个 Promise 对象
  13. product.set(apple).save().then(res => {
  14. console.log(res)
  15. })
  1. let tableName = 'product'
  2. // 通过 `tableName` 实例化一个 `TableObject` 对象,操作该对象即相当于操作对应的数据表
  3. let Product = new qq.BaaS.TableObject(tableName)
  4. // 本地创建一条空记录
  5. let product = Product.create() // product 为 TableRecord 实例
  6. let apple = {
  7. name: 'apple',
  8. price: 1,
  9. desc: ['good'],
  10. amount: 0
  11. }
  12. // 为上面创建的空记录赋值,并保存到服务器,save() 方法返回一个 Promise 对象
  13. product.set(apple).save().then(res => {
  14. console.log(res)
  15. })
  1. let tableName = 'product'
  2. // 通过 `tableName` 实例化一个 `TableObject` 对象,操作该对象即相当于操作对应的数据表
  3. let Product = new BaaS.TableObject(tableName)
  4. // 本地创建一条空记录
  5. let product = Product.create() // product 为 TableRecord 实例
  6. let apple = {
  7. name: 'apple',
  8. price: 1,
  9. desc: ['good'],
  10. amount: 0
  11. }
  12. // 为上面创建的空记录赋值,并保存到服务器,save() 方法返回一个 Promise 对象
  13. product.set(apple).save().then(res => {
  14. console.log(res)
  15. })
  1. let tableName = 'product'
  2. // 通过 `tableName` 实例化一个 `TableObject` 对象,操作该对象即相当于操作对应的数据表
  3. let Product = new my.BaaS.TableObject(tableName)
  4. // 本地创建一条空记录
  5. let product = Product.create() // product 为 TableRecord 实例
  6. let apple = {
  7. name: 'apple',
  8. price: 1,
  9. desc: ['good'],
  10. amount: 0
  11. }
  12. // 为上面创建的空记录赋值,并保存到服务器,save() 方法返回一个 Promise 对象
  13. product.set(apple).save().then(res => {
  14. console.log(res)
  15. })
  1. let tableName = 'product'
  2. // 通过 `tableName` 实例化一个 `TableObject` 对象,操作该对象即相当于操作对应的数据表
  3. let Product = new swan.BaaS.TableObject(tableName)
  4. // 本地创建一条空记录
  5. let product = Product.create() // product 为 TableRecord 实例
  6. let apple = {
  7. name: 'apple',
  8. price: 1,
  9. desc: ['good'],
  10. amount: 0
  11. }
  12. // 为上面创建的空记录赋值,并保存到服务器,save() 方法返回一个 Promise 对象
  13. product.set(apple).save().then(res => {
  14. console.log(res)
  15. })

返回示例

res 结构如下:

  1. {
  2. "statusCode": 201,
  3. "data": {
  4. "_id": "59a3c2b5afb7766a5ec6e84e",
  5. "amount": 0,
  6. "created_at": 1503904437,
  7. "created_by": 36395395,
  8. "desc": ["good"],
  9. "id": "59a3c2b5afb7766a5ec6e84e",
  10. "name": "apple",
  11. "price": 1.0,
  12. "read_perm": ["user:*"],
  13. "updated_at": 1503904437,
  14. "write_perm": ["user:*"]
  15. }
  16. }

数据表支持多种类型的数据,包括数组类型,时间日期类型,geojson 类型和文件类型,并且支持原子操作等高级功能,如下,既是对产品数量的进行原子性减 1 操作:

通过 TableObject 实例上的 getWithoutData() 方法,我们得到一个 TableRecord 实例,该实例指向了 id 为 recordID 的数据行,接下来的对该 TableRecord 实例的操作会修改数据表中对应数据行的内容。

  1. let recordID = 'xxxxxxxxxx' // 数据行 id
  2. let product = Product.getWithoutData(recordID) // product 为 TableRecord 实例,指向了线上 id 为 recordID 的数据行
  3. // 执行原子性减 1
  4. product.incrementBy('amount', -1) // 调用 TableRecord 实例的 incrementBy 方法
  5. product.update().then(res => { // 调用 TableRecord 实例的 update 方法,保存对数据行的修改,update 返回值为一个 Promise 对象
  6. console.log(res)
  7. })

返回示例

res 结构如下:

  1. {
  2. "statusCode": 200,
  3. "data": {
  4. "_id": "59a3c2b5afb7766a5ec6e84e",
  5. "amount": -1,
  6. "created_at": 1503904437,
  7. "created_by": 36395395,
  8. "desc": ["good"],
  9. "id": "59a3c2b5afb7766a5ec6e84e",
  10. "name": "apple",
  11. "price": 1.0,
  12. "read_perm": ["user:*"],
  13. "updated_at": 1503904437,
  14. "write_perm": ["user:*"]
  15. }
  16. }

同时,SDK 提供了多种复杂查询操作,包括正则匹配查询,数组查询,甚至是与或的组合查询,如下是正则匹配查询的使用:

使用高级查询我们需要创建一个 BaaS.Query 对象实例,通过在 Query 实例上调用 matchescompare 等方法来设置查询条件,

然后调用 TableObject 实例的 setQuery 方法,来设置查询条件。

最后调用 TableObject 实例的 find 方法,来发起查询。find 方法返回值为一个 Promise。

  1. // 假设 product 表有一个字段为 product_id ,其中数据的格式形如 '112233'
  2. let Product = new wx.BaaS.TableObject(tableName)
  3. var query = new wx.BaaS.Query()
  4. // 查找产品 ID 以 11 开头,以 33 结尾的产品
  5. regx = /^11\d+33$/
  6. query.matches('product_id', regx)
  7. Product.setQuery(query).find().then(res => { // find 方法返回值为一个 Promise
  8. console.log(res)
  9. })
  1. // 假设 product 表有一个字段为 product_id ,其中数据的格式形如 '112233'
  2. let Product = new qq.BaaS.TableObject(tableName)
  3. var query = new qq.BaaS.Query()
  4. // 查找产品 ID 以 11 开头,以 33 结尾的产品
  5. regx = /^11\d+33$/
  6. query.matches('product_id', regx)
  7. Product.setQuery(query).find().then(res => { // find 方法返回值为一个 Promise
  8. console.log(res)
  9. })
  1. // 假设 product 表有一个字段为 product_id ,其中数据的格式形如 '112233'
  2. let Product = new BaaS.TableObject(tableName)
  3. var query = new BaaS.Query()
  4. // 查找产品 ID 以 11 开头,以 33 结尾的产品
  5. regx = /^11\d+33$/
  6. query.matches('product_id', regx)
  7. Product.setQuery(query).find().then(res => { // find 方法返回值为一个 Promise
  8. console.log(res)
  9. })
  1. // 假设 product 表有一个字段为 product_id ,其中数据的格式形如 '112233'
  2. let Product = new my.BaaS.TableObject(tableName)
  3. var query = new my.BaaS.Query()
  4. // 查找产品 ID 以 11 开头,以 33 结尾的产品
  5. regx = /^11\d+33$/
  6. query.matches('product_id', regx)
  7. Product.setQuery(query).find().then(res => { // find 方法返回值为一个 Promise
  8. console.log(res)
  9. })
  1. // 假设 product 表有一个字段为 product_id ,其中数据的格式形如 '112233'
  2. let Product = new swan.BaaS.TableObject(tableName)
  3. var query = new swan.BaaS.Query()
  4. // 查找产品 ID 以 11 开头,以 33 结尾的产品
  5. regx = /^11\d+33$/
  6. query.matches('product_id', regx)
  7. Product.setQuery(query).find().then(res => { // find 方法返回值为一个 Promise
  8. console.log(res)
  9. })

返回示例

res 结构如下

  1. {
  2. "statusCode": 200,
  3. "data": {
  4. "meta": { // 数据列表的元信息
  5. "limit": 20, // 最大返回数据条数,默认是 20,具体请参考 分页与排序 章节
  6. "next": null, // 下一页的请求链接,null 表示没有下一页
  7. "offset": 0, // 当前数据列表的分页信息,具体请参考 分页与排序 章节
  8. "previous": null, // 上一页的请求链接,null 表示没有上一页
  9. "total_count": 2 // 查询条件命中的总条数
  10. },
  11. "objects": [
  12. {
  13. "created_at": 1487053098,
  14. "id": "59a3c2b5afb7766a5ec6e84f",
  15. "product_id": "112233"
  16. },
  17. {
  18. "created_at": 1487053095,
  19. "id": "59a3c2b5afb7766a5ec6e84e",
  20. "product_id": "112333"
  21. }
  22. ]
  23. }
  24. }

数据表匿名读写权限特别说明

2.x 加入了数据表的匿名读写功能,开启该功能后,在用户未登录的情况下也可以读取数据。而由于数据的添加与更改需要进行用户追踪(安全第一),打开了匿名写权限的数据表,在写操作之前,也需要先完成登录或先创建一个临时匿名用户(详见创建临时匿名用户)。否则,将返回 401 错误。

阅读以下章节,了解更多数据表操作接口: