表格存储支持在查询数据时使用过滤器在服务端按指定条件进行数据过滤,本文介绍如何在 Go SDK 中使用过滤器。
前提条件
过滤器类型
表格存储的过滤器类型包括以下 3 种。
单属性列值过滤器(SingleColumnCondition):判断单个属性列的值是否符合条件。
单属性列正则过滤器(SingleColumnValueRegexFilter):将 String 类型的属性列按照指定的正则表达式匹配子字符串后转换成指定的数据类型,再判断是否符合条件。
组合过滤器(CompositeColumnCondition):将多个条件组合进行数据过滤。
单属性列值过滤器
func NewSingleColumnCondition(columnName string, comparator ComparatorType, value interface{}) *SingleColumnCondition示例代码
以下示例代码以范围查询为例查询主键值为 [row1, row3) 的行数据,并在查询后进行过滤,返回 col1 属性列的值等于 val1 的行数据。
func SingleValueFilterSample(client *tablestore.TableStoreClient) {
// 构建查询条件
rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
rangeRowQueryCriteria.TableName = "test_table"
// 设置查询起始主键
startPK := new(tablestore.PrimaryKey)
startPK.AddPrimaryKeyColumn("id", "row1")
rangeRowQueryCriteria.StartPrimaryKey = startPK
// 设置查询结束主键(返回结果不包含结束主键)
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumn("id", "row3")
rangeRowQueryCriteria.EndPrimaryKey = endPK
// 设置查询版本
rangeRowQueryCriteria.MaxVersion = 1
// 构造过滤器,条件为 col1 == "val1"
singleColumnCondition := tablestore.NewSingleColumnCondition("col1", tablestore.CT_EQUAL, "val1")
rangeRowQueryCriteria.Filter = singleColumnCondition
// 调用 GetRange 方法查询数据
getRangeRequest := new(tablestore.GetRangeRequest)
getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
getRangeResponse, err := client.GetRange(getRangeRequest)
// 返回结果处理
if err != nil {
fmt.Println("Range get failed with error: ", err)
} else {
fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
fmt.Printf("* Read CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
fmt.Printf("* Write CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
fmt.Println("* Rows Data:")
for _, row := range getRangeResponse.Rows {
fmt.Printf("PrimaryKey: %v; Columns: ", row.PrimaryKey.PrimaryKeys)
for _, column := range row.Columns {
fmt.Printf("%v ", column)
}
fmt.Printf("\n")
}
}
}设置行数据不包含判断的属性列时,不返回该行。
singleColumnCondition.FilterIfMissing = true设置只判断查询结果中属性列最新的数据版本。
singleColumnCondition.LatestVersionOnly = true
单属性列正则过滤器
只有 String 类型的属性列支持使用正则过滤器。
func NewSingleColumnValueRegexFilter(columnName string, comparator ComparatorType, rule *ValueTransferRule, value interface{}) *SingleColumnCondition示例代码
以下示例代码以范围查询为例查询主键值为 [row1, row3) 的行数据,并在查询后进行正则匹配过滤,返回 col1 属性列的值满足正则表达式 1([a-z]+)5 且匹配到的子字符串为 aaa 的行数据。
func SingleRegexFilterSample(client *tablestore.TableStoreClient) {
// 构建查询条件
rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
rangeRowQueryCriteria.TableName = "test_table"
// 设置查询起始主键
startPK := new(tablestore.PrimaryKey)
startPK.AddPrimaryKeyColumn("id", "row1")
rangeRowQueryCriteria.StartPrimaryKey = startPK
// 设置查询结束主键(返回结果不包含结束主键)
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumn("id", "row3")
rangeRowQueryCriteria.EndPrimaryKey = endPK
// 设置查询版本
rangeRowQueryCriteria.MaxVersion = 1
// 构造过滤器,条件为 cast<String>(reg(col1)) == “aaa”
valueTransferRule := tablestore.NewValueTransferRule("1([a-z]+)5", tablestore.Variant_STRING)
singleColumnValueRegexFilter := tablestore.NewSingleColumnValueRegexFilter("col1", tablestore.CT_EQUAL, valueTransferRule, "aaa")
rangeRowQueryCriteria.Filter = singleColumnValueRegexFilter
// 调用 GetRange 方法查询数据
getRangeRequest := new(tablestore.GetRangeRequest)
getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
getRangeResponse, err := client.GetRange(getRangeRequest)
// 返回结果处理
if err != nil {
fmt.Println("Range get failed with error: ", err)
} else {
fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
fmt.Printf("* Read CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
fmt.Printf("* Write CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
fmt.Println("* Rows Data:")
for _, row := range getRangeResponse.Rows {
fmt.Printf("PrimaryKey: %v; Columns: ", row.PrimaryKey.PrimaryKeys)
for _, column := range row.Columns {
fmt.Printf("%v ", column)
}
fmt.Printf("\n")
}
}
}组合过滤器
最多支持 32 个条件的组合。
func NewCompositeColumnCondition(lo LogicalOperator) *CompositeColumnValueFilter示例代码
以下示例代码以范围查询为例查询主键值为 [row1, row3) 的行数据,并使用组合过滤器进行数据过滤。
func CompositeFilterSample(client *tablestore.TableStoreClient) {
// 构建查询条件
rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
rangeRowQueryCriteria.TableName = "test_table"
// 设置查询起始主键
startPK := new(tablestore.PrimaryKey)
startPK.AddPrimaryKeyColumn("id", "row1")
rangeRowQueryCriteria.StartPrimaryKey = startPK
// 设置查询结束主键(返回结果不包含结束主键)
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumn("id", "row3")
rangeRowQueryCriteria.EndPrimaryKey = endPK
// 设置查询版本
rangeRowQueryCriteria.MaxVersion = 1
// 构造单属性列值过滤器1,条件为 col1 == "val1"
singleColumnCondition1 := tablestore.NewSingleColumnCondition("col1", tablestore.CT_EQUAL, "val1")
// 构造单属性列正则过滤器2,条件为 cast<String>(reg(col2)) == "aaa"
valueTransferRule := tablestore.NewValueTransferRule("1([a-z]+)5", tablestore.Variant_STRING)
singleColumnValueRegexFilter2 := tablestore.NewSingleColumnValueRegexFilter("col2", tablestore.CT_EQUAL, valueTransferRule, "aaa")
// 构造组合过滤器1,条件为 col1 == "val1" or cast<String>(reg(col2)) == "aaa"
compositeCondition1 := tablestore.NewCompositeColumnCondition(tablestore.LO_OR)
compositeCondition1.AddFilter(singleColumnCondition1)
compositeCondition1.AddFilter(singleColumnValueRegexFilter2)
// 构造单属性列值过滤器2,条件为 col3 == "val3"
singleColumnCondition3 := tablestore.NewSingleColumnCondition("col3", tablestore.CT_EQUAL, "val3")
// 构造组合过滤器2,条件为 组合过滤器1 and 单属性列值过滤器2,即 (col1 == "val1" or cast<String>(reg(col2)) == "aaa") and col3 == "val3"
compositeCondition2 := tablestore.NewCompositeColumnCondition(tablestore.LO_AND)
compositeCondition2.AddFilter(compositeCondition1)
compositeCondition2.AddFilter(singleColumnCondition3)
// 查询结果添加过滤器
rangeRowQueryCriteria.Filter = compositeCondition2
// 调用 GetRange 方法查询数据
getRangeRequest := new(tablestore.GetRangeRequest)
getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
getRangeResponse, err := client.GetRange(getRangeRequest)
// 返回结果处理
if err != nil {
fmt.Println("Range get failed with error: ", err)
} else {
fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
fmt.Printf("* Read CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
fmt.Printf("* Write CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
fmt.Println("* Rows Data:")
for _, row := range getRangeResponse.Rows {
fmt.Printf("PrimaryKey: %v; Columns: ", row.PrimaryKey.PrimaryKeys)
for _, column := range row.Columns {
fmt.Printf("%v ", column)
}
fmt.Printf("\n")
}
}
}相关文档
该文章对您有帮助吗?