更新数据项

更新数据项

BaaS.TableRecord#update(options)

参数说明

options:

参数
类型
必填
默认
说明

enableTrigger

boolean

true

是否触发触发器

withCount

boolean

true

是否返回 total_count

{{totalCount.withCountTips()}}

info 更新单条记录,若要使用 enableTrigger, 则需要 SDK 3.11.0 及以上版本。

关于指定 SDK 版本,请参考SDK 版本指定与查看当前版本号

info 3.13.0 版本前,数据更新操作会结合用户输入数据以及原有的数据行其余字段数据,使用整个数据对象进行保存;

3.13.0 版本后(包括 3.13.0),数据更新操作仅会针对用户输入数据对字段进行单独更新。

操作步骤

1.通过 数据表 ID数据表名 实例化一个 TableObject 对象,操作该对象即相当于操作对应的数据表

let MyTableObject = new BaaS.TableObject(tableID | tableName)

参数说明

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

参数名
类型
说明

tableID

integer

数据表的 ID

tableName

string

数据表名

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

let MyRecord = MyTableObject.getWithoutData(recordID)

参数说明

参数
类型
必填
说明

recordID

String

数据行 id

3.调用 set 或 unset 修改指定记录的数据

a. set 操作

为某个字段赋值

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

参数说明

参数
类型
必填
说明

key

String

在数据表中的类型必须是 Number 或 Integer

value

any

与 key 字段的类型保持一致

obj

Object

一次性赋值的键值对对象, 如 {a: 10, b: 20}

b. unset 操作

将某个字段的值清空

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

参数说明

参数
类型
必填
说明

key

String

在数据表中的类型必须是 Number 或 Integer

obj

Object

一次性赋值的键值对对象, 如 {a: '', b: ''}

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

a.一次性赋值:

b.逐个赋值

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

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

3.若更新数据中包含 created_by, created_at, updated_at 这几个字段,则最终更新完成的数据中这几个字段将以更新数据中设置的字段值为准。

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

MyRecord.update()

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

普通数据更新

请求示例

返回示例

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

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

常见错误:

错误码 err.code
可能的原因

400

1. 提交的数据不合法、2. 重复创建数据(设置了唯一索引)

403

没有权限更新数据

404

数据行不存在

计数器原子性更新

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

product.incrementBy(key, value)

参数说明

参数
类型
必填
说明

key

String

在数据表中的类型必须是 Number 或 Integer,也可以为 Object 类型中的 Number 或 Integer 字段,具体参考请求示例

value

Number 或 Integer

与 key 的类型保持一致

请求示例

更新在数据表中的类型是 Number 或 Integer 的数据:

更新数据表里 Object 类型中某个字段是 Number 或 Integer 的数据:

更新 pointer 类型字段

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

字段名
字段类型
说明

customer

pointer

指向了 customer

user

pointer

指向了 _userprofile

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

示例代码

返回示例

数组原子性更新

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

product.append(key, value)

参数说明

参数
类型
必填
说明

key

String

在数据表中的类型必须是 Array

value

Array 或 Array item

-

请求示例

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

product.uAppend(key, value)

参数说明

参数
类型
必填
说明

key

String

在数据表中的类型必须是 Array

value

Array 或 Array item

-

请求示例

从原数组中删除指定的值

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

请求示例

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

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

从原数组中删除最后一项

product.pop(key)

参数说明

参数
类型
必填
说明

key

String

在数据表中的类型必须是 Array

请求示例

返回示例

从原组中删除第一项

product.shift(key)

参数说明

参数
类型
必填
说明

key

String

在数据表中的类型必须是 Array

请求示例

返回示例

自定义条件批量更新数据项

通过设置自定义查询条件 Query,将符合条件的数据进行批量更新操作

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

其中:

请求示例

返回示例

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

状态码说明

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

按条件批量更新时不触发触发器

不触发触发器的情况下会有以下的行为:

  • 当更新命中总条目 <= 1000 时,无论 limit 设置为多少,均为同步更新,将返回每一条更新的 id 和更新结果,详见下方返回示例中同步执行部分。

  • 当更新命中总条目 > 1000 时,根据设置 limit 的不同,将有下方两种行为:

    • limit <= 1000 时,操作记录为同步执行

    • limit > 1000 或未设置时,则会转为异步执行并移除 limit 限制,变成操作全部

返回示例

同步操作时,回调中的 res 对象结构如下:

异步操作时,回调中的 res 对象结构如下:

info 获取异步执行结果,请查看接口文档

更新 object 类型内的属性

参数说明

参数
类型
必填
说明

key

String

在数据表中的类型必须是 Object

value

Object

更新的对象

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

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

执行结果

修改数据行 ACL

有时候我们需要设置特定数据行的 ACL 权限,之前只能在知晓云控制台修改数据行 ACL,现在云函数中支持通过代码来完该操作了。

假设 product 表中有一行 id 为 5bffbab54b30640ba8135650 的数据行,目前其 acl 为 所有人可读,所有人可写,现在需要将其修改为 用户组【开发人员】和创建者可写创建者可读

其中用户组 开发人员 的 group_id 为 656、创建者的 user_id (对应 _userprofile 表中的 id 列) 为 37087886

write_permread_perm 的可选值请参考 数据表操作-创建数据表 小节

示例代码

返回示例

res 结构如下:

Last updated

Was this helpful?