更新数据项

{% tabs first=”SDK 1.1.0 及以上版本”, second=”SDK 1.1.0 以下版本” %}

{% content “first” %}

SDK 1.1.0 及以上版本

操作步骤

1.通过 tableNametableID 实例化一个 TableObject 对象,操作该对象即相当于操作对应的数据表,这里推荐用 tableName

let MyTableObject = new wx.BaaS.TableObject(tableName)

参数说明

tableName 和 tableID 二选一,不能同时存在

参数 类型 必填 说明
tableID Number 数据表的 ID
tableName String 数据表名(SDK >= 1.2.0)

2.通过数据行 id(以下用 recordID 参数名表示) 设置指定数据行

let MyRecord = MyTableObject.getWithoutData(recordID)

参数说明

参数 类型 必填 说明
recordID String 数据行 id

3.调用 set 或 unset (SDK >= 1.12.0) 修改指定记录的数据

a. set 操作

为某个字段赋值

product.set(key, value)product.set(obj)

参数说明

参数 类型 必填 说明
key String 在数据表中的类型必须是 Number 或 Integer
value any 与 key 字段的类型保持一致
obj Object 一次性赋值的键值对对象, 如 {a: 10, b: 20}

b. unset 操作 (SDK >= 1.12.0)

将某个字段的值清空

product.unset(key)product.unset(obj)

info SDK 版本需 >= 1.12.0

参数说明

参数 类型 必填 说明
key String 在数据表中的类型必须是 Number 或 Integer
obj Object 一次性赋值的键值对对象, 如 {a: '', b: ''}

set 和 unset 方法都支持两种类型的赋值操作:

a. 一次性赋值:

  1. MyRecord.set({
  2. key1: value1,
  3. key2: value2
  4. })

b. 逐个赋值:

  1. MyRecord.set(key1, value1)
  2. MyRecord.set(key2, value2)

info 1.对同一字段进行多次 set 操作,后面的数据会覆盖掉前面的数据

2.不可同时用 setunset 操作同一字段,否则会报 605 错误

4.将修改后的记录保存到服务器

MyRecord.update()

通过上面的四个步骤,即完成了一条记录的插入,具体操作阅读以下内容。

普通数据更新

请求示例

  1. // 更新 tableName 为 'product' 的数据表中 id 为 59897882ff650c0477f00485 的数据行的 price 字段
  2. let tableName = 'product'
  3. let recordID = '59897882ff650c0477f00485' // 数据行 id
  4. let Product = new wx.BaaS.TableObject(tableName)
  5. let product = Product.getWithoutData(recordID)
  6. product.set('price', 11)
  7. product.update().then(res => {
  8. // success
  9. }, err => {
  10. // err
  11. })

返回示例

then 回调中的 res 对象结构如下:

  1. {
  2. "statusCode": 200,
  3. "data": {
  4. "created_at": 1487053095,
  5. "id": "7",
  6. "name": "fushi",
  7. "price": 11,
  8. "desc": ["sweet", "red"],
  9. "amount": 2
  10. }
  11. }

err 对象结构请参考错误码和 HError 对象

常见错误:

错误码 err.code 可能的原因
400 1. 提交的数据不合法、2. 重复创建数据(设置了唯一索引)
403 没有权限更新数据
404 数据行不存在

更新 object 类型内的属性

  1. product.patchObject('obj1', {name: '123'})

参数说明

参数 类型 必填 说明
key String 在数据表中的类型必须是 Object
value Object 更新的对象

info 该操作的效果类似 Object.assign(), 是浅合并,也就是只合并第一层,嵌套的属性仍然是被替换。 对象内的属性名只能包含字母、数字和下划线,必须以字母开头,比如 {$ifanr.x: 123}{知晓云: "test"} 是错误的

请求示例 假设数据表 Product 中有数据行如下

  1. [{
  2. id: "7",
  3. obj1: {a: [1, 2, 3], b: 666, c: {age: 100}}
  4. }]
  1. let record = Product.getWithoutData('7')
  2. let patch = {a: [222], b: 555, d: 888}
  3. record.patchObject('obj1', patch)

执行结果

  1. [
  2. {
  3. id: '7',
  4. obj1: {a: [222], b: 555, c: {age: 100}, d: 888}
  5. }
  6. ]

更新 pointer 类型字段 (SDK >= 1.10.0)

假设有 product 表, product 表部分字段如下:

字段名 字段类型 说明
customer pointer 指向了 customer
user pointer 指向了 _userprofile

现在需要更新 product 表中 id 为 5bdfaf068asd123123asd 的数据行

示例代码

  1. // 获取一个 tableRecord 实例
  2. let Customer = new wx.BaaS.TableObject('customer')
  3. let customer = Customer.getWithoutData('5bdfaf068b155c0891d064ad')
  4. // 获取要修改的数据行的实例
  5. let Product = new wx.BaaS.TableObject('product')
  6. let product = Product.getWithoutData('5bdfaf068asd123123asd')
  7. // 69147880 为 _userprofile 表中某行数据的 id
  8. let user = new wx.BaaS.User().getWithoutData(69147880)
  9. // 给 pointer 字段赋值
  10. product.set('customer', customer)
  11. product.set('user', user)
  12. product.update().then(res=>{
  13. // success
  14. })

返回示例

  1. {
  2. "statusCode": 200,
  3. "data": {
  4. "_id": "5bdfaf068asd123123asd",
  5. "created_at": 1541744690,
  6. "created_by": 3,
  7. "id": "5bdfaf068asd123123asd",
  8. "customer": {
  9. "id": "5bdfaf068b155c0891d064ad",
  10. "_table": "customer"
  11. },
  12. "user": {
  13. "id": 69147880,
  14. "_table": "_userprofile"
  15. },
  16. "read_perm": [ "user:*" ],
  17. "updated_at": 1541744690,
  18. "write_perm": [ "user:*" ] }
  19. }

计数器原子性更新

对数字类型的字段进行原子性增减操作。当请求同时对一个数据进行增减时,原子性使得冲突和覆盖导致的数据不正确的情况不会出现。

product.incrementBy(key, value)

参数说明

参数 类型 必填 说明
key String 在数据表中的类型必须是 Number 或 Integer
value Number 或 Integer 与 key 的类型保持一致

请求示例

  1. product.incrementBy('amount', 1)
  2. product.update().then(res => {}, err => {})

数组原子性更新

待插入的数组 加到原数组末尾

product.append(key, value)

参数说明

参数 类型 必填 说明
key String 在数据表中的类型必须是 Array
value Array 或 Array item -

请求示例

  1. product.append('desc', ['big'])
  2. // or
  3. product.append('desc', 'big')

待插入的数组 中不包含在原数组的数据加到原数组末尾

product.uAppend(key, value)

参数说明

参数 类型 必填 说明
key String 在数据表中的类型必须是 Array
value Array 或 Array item -

请求示例

  1. product.uAppend('desc', ['sweet'])
  2. // or
  3. product.uAppend('desc', 'sweet')

从原数组中删除指定的值

product.remove(key, value)

参数说明

参数 类型 必填 说明
key String 在数据表中的类型必须是 Array
value Array 或 Array item 如果元素类型是 geojson、object、file,则只能是 Array item,或 length 为 1 的 Array

info 如果 array 类型字段的子元素类型是 geojson、object 或 file,则 value 只能是 Array item 或 length 为 1 的 Array, value 数组中多余的项,将会被忽略。

下面的操作是能按预期执行的:

product.remove('array_obj', {a: 10})

product.remove('array_obj', [{a: 10}])

下面的 {a: 30},将会被忽略:

product.remove('array_obj', [{a: 10}, {a: 30}])

请求示例

  1. product.remove('desc', ['sweet'])
  2. // or
  3. product.remove('desc', 'sweet')

info同一字段设置多次 appendremove 操作后进行 update 操作,则只有最后一次进行的 appendremove 是有效的;如果同时对同一字段进行 setremoveappend 操作,则只有最后执行的操作是有效的。

注: 设置的数据要与预先在知晓云平台设定的数据类型一致,当仅更新一个字段,并且数据不合法时,将无法成功保存,请求返回 Failed to save record, type conflict on fields 错误,如果更新多个字段,其中有一个或一个以上字段数据合法,则请求成功,但其中数据不合法的字段将不会成功保存,如下示例:

  1. /*
  2. * 同时设置 amount 和 date 字段,其中 date 为日期类型,这里为其赋了一个字符串类型的值,
  3. * 该请求会返回 200,但只有 amount 被成功设置为 10
  4. */
  5. let order = Order.getWithoutData(orderID)
  6. order.set('amount', 10)
  7. order.set('date', 'abc')
  8. order.update()

按条件批量更新数据项

SDK 1.4.0 及以上版本支持批量更新数据项。可以通过设置自定义查询条件 Query,将符合条件的数据进行批量更新操作。

注意:由于条件查询可能命中非常多的数据,默认情况下,限制为最多更新前 1000 条数据。 如需要一次性更新更多数据,请参考下一个章节:不触发触发器的更新,或者通过维护分页来进行。

其中:

请求示例

  1. let MyTableObject = new wx.BaaS.TableObject(tableName)
  2. let query = new wx.BaaS.Query()
  3. // 设置查询条件(比较、字符串包含、组合等)
  4. ...
  5. // limit、offset 可以指定按条件查询命中的数据分页
  6. let records = MyTableObject.limit(10).offset(0).getWithoutData(query)
  7. // 与更新特定记录一致
  8. records.set(key1, value1)
  9. records.incrementBy(key2, value2)
  10. records.append(key3, value3)
  11. records.update().then(res => {}, err => {})

返回示例

then 回调中的 res 对象结构如下:

  1. {
  2. "statusCode": 200, // 200 表示更新成功, 注意这不代表所有数据都更新成功,具体要看 operation_result 字段
  3. "data": {
  4. "succeed": 8, // 成功更新记录数
  5. "total_count": 10, // where 匹配的记录数,包括无权限操作记录
  6. "offset": 0,
  7. "limit": 1000,
  8. "next": null, // 下一次更新 url,若为 null 则表示全部更新完毕
  9. "operation_result": [ // 创建的详细结果
  10. {
  11. "success": { // 成功时会有 success 字段
  12. "id": "5bffbab54b30640ba8135650",
  13. "updated_at": 1543486133
  14. }
  15. },
  16. {
  17. "success": {
  18. "id": "5bffbab54b30640ba8135651",
  19. "updated_at": 1543486133
  20. }
  21. },
  22. {
  23. "error": { // 失败时会有 error 字段
  24. "code": 16837,
  25. "err_msg": "数据更新失败,具体错误信息可联系知晓云微信客服:minsupport3 获取。"
  26. }
  27. }
  28. ]
  29. }
  30. }

catch 回调中的 err 对象:

请参考错误码和 HError 对象

状态码说明

200 更新成功,400 请求数据非法

批量更新时不触发触发器

info SDK 版本需 >= 1.9.1

  1. let MyTableObject = new wx.BaaS.TableObject(tableName)
  2. let query = new wx.BaaS.Query()
  3. // 设置查询条件(比较、字符串包含、组合等)
  4. //...
  5. let records = MyTableObject.getWithoutData(query)
  6. // 与更新特定记录一致
  7. // 设置更新内容 ...
  8. // 知晓云后台设置的触发器将不会被触发
  9. records.update({enableTrigger: false}).then(res => {}, err => {})

{% content “second” %}

SDK 1.1.0 以下版本

info 该写法在 sdk v2.0 前仍然有效

wx.BaaS.updateRecord(OBJECT)

OBJECT 参数说明

参数 类型 必填 说明
tableID Number 数据表 ID
recordID String 数据项 ID
data Object 待更新的自定义数据

请求示例

  1. // 更新 tableID 为 10 的数据表中 id 为 59897882ff650c0477f00485 的数据项的 name 字段
  2. let tableID = 10
  3. let recordID = '59897882ff650c0477f00485'
  4. let data = {
  5. name: "VwlPCaUJzxAyNUSNMgzikTQySFoaTZtm"
  6. }
  7. let objects = {
  8. tableID,
  9. recordID,
  10. data
  11. }
  12. wx.BaaS.updateRecord(objects).then(res => {
  13. // success
  14. }, err => {
  15. // err
  16. })

返回参数

参数 类型 说明
id String 数据项 ID
created_at Number 创建时间
is_admin Boolean 自定义字段
name String 自定义字段
price Number 自定义字段
tags Array 自定义字段

返回示例

res.data:

  1. {
  2. "created_at": 1487055951,
  3. "id": "59897882ff650c0477f00485",
  4. "is_admin": false,
  5. "name": "VwlPCaUJzxAyNUSNMgzikTQySFoaTZtm",
  6. "price": 10,
  7. "tags": ["UZbJ", "eSYo"]
  8. }

info 本方法支持部分更新和全量更新

{% endtabs %}