Tablestoreはサーバー上でクエリ結果をフィルタリングし、フィルタリングされた結果を返します。フィルター条件を満たす行のみが返されます。
前提条件
OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。
メソッド
GetRow、BatchGetRow、またはGetRange操作を呼び出してデータをクエリする場合、フィルターを使用してフィルター条件を満たす行のみを返すことができます。
フィルターには、SingleColumnValueFilterとCompositeColumnValueFilterがあります。
SingleColumnValueFilter:参照列の値のみに基づいて、行を返すかどうかを決定します。
CompositeColumnValueFilter:複数の参照列の値に対するフィルター条件の組み合わせに基づいて、行を返すかどうかを決定します。
フィルターの詳細については、フィルターの設定を参照してください。
使用上の注意
フィルター条件は、=, !=, >, >=, <, <= の関係演算子と、NOT、AND、OR の論理演算子をサポートしています。フィルター条件には、最大10個のサブ条件を含めることができます。
フィルターで使用される参照列は、クエリ結果に含まれている必要があります。データの読み取り元となる指定された列に参照列が含まれていない場合、フィルターは参照列の値をクエリできません。
GetRange操作を使用する場合、一度に最大5,000行または4MBのデータをスキャンできます。
スキャンの範囲内でフィルター条件に一致するデータがない場合、返される行は空になります。ただし、NextStartPrimaryKeyは空ではない場合があります。 NextStartPrimaryKeyが空でない場合は、パラメーター値を使用して、NextStartPrimaryKeyの戻り値が空になるまでスキャンを続けます。
パラメーター
パラメーター | 必須 | 説明 |
ColumnName | はい | フィルターで使用される参照列の名前。 |
ColumnValue | はい | フィルターで使用される参照列の値。 |
ComparatorType | はい | フィルターで使用される関係演算子。関係演算子の詳細については、ComparatorTypeを参照してください。 サポートされている関係演算子は、EQUAL (=)、NOT_EQUAL (!=)、GREATER_THAN (>)、GREATER_EQUAL (>=)、LESS_THAN (<)、LESS_EQUAL (<=) です。 |
LogicOperator | いいえ | フィルターで使用される論理演算子。論理演算子の詳細については、LogicalOperatorを参照してください。 論理演算子には、NOT、AND、OR があります。Tablestoreでは、 |
FilterIfMissing | いいえ | 行に参照列が存在しない場合に、行を返すかどうかを指定します。タイプ:ブール値。有効な値:
|
LatestVersionOnly | いいえ | 参照列に複数のバージョンのデータが含まれている場合に、比較に参照列の最新バージョンのみを使用するかどうかを指定します。タイプ:ブール値。有効な値:
|
例
SingleColumnValueFilterを使用してデータをフィルタリングする
次のサンプルコードは、データテーブルから行を読み取る方法の例を示しています。この例では、c1列がデータのフィルタリングに参照列として使用され、最新バージョンのデータが読み取られます。
func GetRowWithFilter(client *tablestore.TableStoreClient, tableName string) {
fmt.Println("begin to get row")
pk := new(tablestore.PrimaryKey)
pk.AddPrimaryKeyColumn("pk1", "pk1value1")
pk.AddPrimaryKeyColumn("pk2", int64(2))
pk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
// 参照列をc1列に設定し、参照列の値をZhejiangに、FilterIfMissingパラメーターをfalseに設定します。
condition := tablestore.NewSingleColumnCondition("c1", tablestore.ComparatorType(tablestore.CT_EQUAL), "Zhejiang")
condition.FilterIfMissing = false
criteria := &tablestore.SingleRowQueryCriteria{
TableName: tableName,
PrimaryKey: pk,
MaxVersion: 1,
Filter: condition,
}
getResp, err := client.GetRow(&tablestore.GetRowRequest{SingleRowQueryCriteria: criteria})
if err != nil {
fmt.Println("getrow failed with error:", err)
} else {
colMap := getResp.GetColumnMap()
if len(colMap.Columns) > 0 {
fmt.Println("length is ", len(colMap.Columns))
fmt.Println("get row col0 result is ", getResp.Columns[0].ColumnName, getResp.Columns[0].Value)
} else {
fmt.Println("No data that meets the conditions.") // 条件を満たすデータがありません。
}
}
}
CompositeColumnValueFilterを使用してデータをフィルタリングする
次のサンプルコードは、データテーブルから行を読み取る方法の例を示しています。この例では、c1列とc2列が参照列として使用されます。 c1列の値がZhejiang
で、c2列の値がHangzhou
の場合、行が返されます。
func GetRowWithCompositeColumnValueFilter(client *tablestore.TableStoreClient, tableName string) {
fmt.Println("begin to get row")
pk := new(tablestore.PrimaryKey)
pk.AddPrimaryKeyColumn("pk1", "pk1value1")
pk.AddPrimaryKeyColumn("pk2", int64(2))
pk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
// c1列の値がZhejiangで、c2列の値がHangzhouの場合にフィルター条件が満たされるように指定します。
filter := tablestore.NewCompositeColumnCondition(tablestore.LO_AND)
filter1 := tablestore.NewSingleColumnCondition("c1", tablestore.CT_EQUAL, "Zhejiang")
filter2 := tablestore.NewSingleColumnCondition("c2", tablestore.CT_EQUAL, "Hangzhou")
filter.AddFilter(filter2)
filter.AddFilter(filter1)
criteria := &tablestore.SingleRowQueryCriteria{
TableName: tableName,
PrimaryKey: pk,
MaxVersion: 1,
Filter: filter,
}
getResp, err := client.GetRow(&tablestore.GetRowRequest{SingleRowQueryCriteria: criteria})
if err != nil {
fmt.Println("getrow failed with error:", err)
} else {
colMap := getResp.GetColumnMap()
if len(colMap.Columns) > 0 {
fmt.Println("length is ", len(colMap.Columns))
fmt.Println("get row col0 result is ", getResp.Columns[0].ColumnName, getResp.Columns[0].Value)
} else {
fmt.Println("No data that meets the conditions.") // 条件を満たすデータがありません。
}
}
}
参照
アプリケーションが異なる属性列をクエリ条件として使用してデータをクエリする必要がある場合は、属性列をセカンダリインデックスのプライマリキー列として指定できます。このようにして、セカンダリインデックスを使用して、属性列に基づいてデータをクエリできます。これにより、データクエリが高速化されます。詳細については、セカンダリインデックスを参照してください。
ビジネスで多次元クエリとデータ分析が必要な場合は、検索インデックスを作成し、必要な属性列を検索インデックスのフィールドとして指定できます。その後、検索インデックスを使用してデータのクエリと分析を行うことができます。たとえば、検索インデックスを使用して、非プライマリキー列、ブールクエリ、あいまいクエリに基づいてクエリを実行できます。また、検索インデックスを使用して、最大値と最小値を取得したり、行数の統計を収集したり、クエリ結果をグループ化したりすることもできます。詳細については、検索インデックスを参照してください。
SQLクエリ機能を使用して、テーブル内のデータのクエリと分析を行うことができます。詳細については、データのクエリを参照してください。