部分字段查询和更新
部分字段查询 / 更新指只读取或只修改一条记录的部分 value 字段,而不是整条记录。相比整记录读写,它能减少网络传输量与服务端处理开销,适合记录较大、但每次只关心少量字段的场景。
PB 表与 TDR 表的能力差异较大,下面分别说明。
1. PB 表
PB 对象是嵌套树结构,支持对一级字段、嵌套字段、map 元素、数组元素 / 范围等做部分查询和更新(如 timekey、pay.order.desc、str_map['key'].desc、pay_array[0-100])。
PB 表的完整说明(字段路径语法、
FieldGet/FieldSet/FieldUpdate接口、记录不存在时创建、ResultFlag 等)直接参见 PB 表 - 部分字段查询和更新。
2. TDR 表
TDR 表的记录是扁平的字段结构,部分字段查询 / 更新只允许指定一级 value 字段名:
- 只能填一级 value 字段名,不支持嵌套路径(无
a.b.c)、数组下标、map key 等 PB 那样的路径表达; - 字段名只能是 value 字段,不能包含 key 字段名;
- 每个字段名不超过 32 字节,以
\0结尾。
2.1 支持的操作
部分字段查询 / 更新可用于:Get、BatchGet、GetByPartKey、ListGet、ListGetAll、Replace、Update、BatchReplace、BatchUpdate、ListReplace、TableTraverse 等操作。
2.2 C++ TDR SDK
通过 TcaplusServiceRequest::SetFieldNames(或逐个 AddFieldName)指定要查询 / 更新的 value 字段名。
部分字段查询:
const char* fields[] = {"name", "level"}; // 只读这两个 value 字段,均为一级字段名
req->SetFieldNames(fields, 2);
// ... 设置 key 后发送 ...
部分字段更新(关键顺序:必须先 SetData(),再 SetFieldNames()):
// 1) 先把含增量数据的整条记录设置进去
req->SetData(&record, record_size);
// 2) 再指定只更新其中哪些 value 字段
const char* fields[] = {"level"};
req->SetFieldNames(fields, 1);
顺序不能反:若先
SetFieldNames()再SetData(),部分字段更新不会生效。
2.3 Go TDR SDK
通过 option.TDROpt.FieldNames 指定要查询 / 更新的一级 value 字段名,SDK 内部转调 req.SetFieldNames。
部分字段查询:
opt := &option.TDROpt{
FieldNames: []string{"name", "level"}, // 只读这两个一级 value 字段
}
err := client.DoGet(TableName, data, opt)
部分字段更新:
opt := &option.TDROpt{
FieldNames: []string{"level"}, // 只更新该 value 字段
}
// data 里填好 key + 要更新字段的增量值
err := client.DoUpdate(TableName, data, opt)
3. 与其它文档的关系
- PB 表部分字段查询和更新(含字段路径语法、Schema-free、ResultFlag):PB 表 - 部分字段查询和更新
- 条件过滤与 operation 更新语法:条件过滤和更新语法说明、条件过滤和更新功能
- 返回数据控制:ResultFlag响应数据返回控制