部分字段查询和更新

部分字段查询 / 更新指只读取或只修改一条记录的部分 value 字段,而不是整条记录。相比整记录读写,它能减少网络传输量与服务端处理开销,适合记录较大、但每次只关心少量字段的场景。

PB 表与 TDR 表的能力差异较大,下面分别说明。

1. PB 表

PB 对象是嵌套树结构,支持对一级字段、嵌套字段、map 元素、数组元素 / 范围等做部分查询和更新(如 timekeypay.order.descstr_map['key'].descpay_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 支持的操作

部分字段查询 / 更新可用于:GetBatchGetGetByPartKeyListGetListGetAllReplaceUpdateBatchReplaceBatchUpdateListReplaceTableTraverse 等操作。

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. 与其它文档的关系

results matching ""

    No results matching ""