更新数据项
更新数据项
BaaS.TableRecord#update(options)
参数说明
options(批量更新时需要设置):
enableTrigger
boolean
否
true
是否触发触发器
withCount
boolean
否
false
是否返回 total_count
expand
string 或 string[]
否
空字符串
是否返回对应字段扩展
{{totalCount.withCountTips()}}
info 更新单条记录,若要使用
enableTrigger
, 则需要 SDK 3.14.4 及以上版本
info 临时用户更新数据,请先查看数据表匿名读写权限特别说明
info SDK 3.14.5 及以上版本提供单条数据更新返回字段扩展的支持。expand 属性可传入字符串或者包含字符串的数组。例如:
record.update({expand: 'created_by'})
record.update({expand: ['created_by']})
有关字段扩展的介绍,请查看字段扩展。
info 3.15.1 版本前,数据更新操作会结合用户输入数据以及原有的数据行其余字段数据,使用整个数据对象进行保存;
3.15.1 版本后(包含 3.15.1),数据更新操作仅会针对用户输入数据对字段进行单独更新。
操作步骤
1.通过 tableName
或 tableID
实例化一个 TableObject
对象,操作该对象即相当于操作对应的数据表,这里推荐用 tableName
参数说明
tableName 和 tableID 二选一,不能同时存在
实例化 TableObject,如操作数据表名为 'product' 的数据表,可进行如下实例化:new BaaS.TableObject('product')
tableID
Number
是
数据表的 ID
tableName
String
是
数据表名
2.通过数据行 id(以下用 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.不可同时用
set
与unset
操作同一字段,否则会报 605 错误3.若更新数据中包含
created_by, created_at, updated_at
这几个字段,则最终更新完成的数据中这几个字段将以更新数据中设置的字段值为准。
4.将修改后的记录保存到服务器
product.update()
通过上面的四个步骤,即完成了一条记录的更新,具体操作阅读以下内容。
普通数据更新
请求示例
返回示例
then 回调中的 res 对象结构如下:
err 对象结构请参考错误码和 HError 对象
常见错误:
400
1. 提交的数据不合法、2. 重复创建数据(设置了唯一索引)
403
没有权限更新数据
404
数据行不存在
更新 file 类型数据
使用 SDK 1.1.2 及以上版本,操作如下:
返回示例
res 结构如下
使用 SDK 1.1.2 以下版本,操作如下:
更新 geojson 类型数据
查看 地理位置操作 章节
更新 object 类型内的属性
参数说明
key
String
是
在数据表中的类型必须是 Object
value
Object
是
更新的对象
info 该操作的效果类似 Object.assign(), 是浅合并,也就是只合并第一层,嵌套的属性仍然是被替换。 对象内的属性名只能包含字母、数字和下划线,必须以字母开头,比如
{$ifanr.x: 123}
和{知晓云: "test"}
是错误的
请求示例 假设数据表 Product 中有数据行如下
执行结果
更新 pointer 类型字段
假设有 product 表, product 表部分字段如下:
customer
pointer
指向了 customer
表
user
pointer
指向了 _userprofile
表
现在需要更新 product 表中 id 为 5bdfaf068asd123123asd
的数据行
示例代码
返回示例
计数器原子性更新
对数字类型的字段进行原子性增减操作。当请求同时对一个数据进行增减时,原子性使得冲突和覆盖导致的数据不正确的情况不会出现。
product.incrementBy(key, value)
参数说明
key
String
是
在数据表中的类型必须是 Number 或 Integer,也可以为 Object 类型中的 Number 或 Integer 字段,具体参考请求示例
value
Number 或 Integer
是
与 key 的类型保持一致
请求示例
更新数据表里 Object 类型中某个字段是 Number 或 Integer 的数据:
数组原子性更新
将 待插入的数组 加到原数组末尾
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, value 数组中多余的项,将会被忽略。
下面的操作是能按预期执行的:
product.remove('array_obj', {a: 10})
product.remove('array_obj', [{a: 10}])
请求示例
info 对同一字段设置多次
append
或remove
操作后进行update
操作,则只有最后一次进行的append
或remove
是有效的;如果同时对同一字段进行set
、remove
和append
操作,则只有最后执行的操作是有效的。
注: 设置的数据要与预先在知晓云平台设定的数据类型一致,当仅更新一个字段,并且数据不合法时,将无法成功保存,请求返回 Failed to save record, type conflict on fields
错误,如果更新多个字段,其中有一个或一个以上字段数据合法,则请求成功,但其中数据不合法的字段将不会成功保存,如下示例:
从原数组中删除最后一项
product.pop(key)
参数说明
key
String
是
在数据表中的类型必须是 Array
请求示例
返回示例
从原组中删除第一项
product.shift(key)
参数说明
key
String
是
在数据表中的类型必须是 Array
请求示例
返回示例
按条件批量更新数据项
SDK 1.4.0 及以上版本支持批量更新数据项。可以通过设置自定义查询条件 Query,将符合条件的数据进行批量更新操作。
注意:由于条件查询可能命中非常多的数据,默认情况下,限制为最多更新前 1000 条数据。 如需要一次性更新更多数据,请参考下一个章节:不触发触发器的更新,或者通过维护分页来进行。
其中:
请求示例
返回示例
then 回调中的 res 对象结构如下:
catch 回调中的 err 对象:
状态码说明
200 更新成功,400 请求数据非法
批量更新时不触发触发器
SDK 1.9.1 及以上版本支持批量更新数据项时不触发触发器。该模式在批量更新数据时,不会触发设置好的触发器,会对查询条件匹配的数据全部更新,没有最多 1000 条的限制。
SDK 2.9.0 及以上版本,在 enableTrigger 为 false 时,SDK 将不会设置默认的 limit (值为 20),如果用户没有设置 limit,则为全量更新。
不触发触发器的情况下会有以下的行为:
当更新命中总条目 <= 1000 时,无论 limit 设置为多少,均为同步更新,将返回每一条更新的 id 和更新结果,详见下方返回示例中同步执行部分。
当更新命中总条目 > 1000 时,根据设置 limit 的不同,将有下方两种行为:
limit <= 1000 时,操作记录为同步执行
limit > 1000 或未设置时,则会转为异步执行并移除 limit 限制,变成操作全部
返回示例
同步操作时,then 回调中的 res 对象结构如下:
异步操作时,then 回调中的 res 对象结构如下:
info 获取异步执行结果,请查看接口文档
Last updated
Was this helpful?