Tablestore はサーバー上でクエリ結果をフィルタリングし、フィルタリングされた結果を返します。フィルター条件を満たす行のみが返されます。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。
手順
GetRow、BatchGetRow、または GetRange 操作を呼び出してデータをクエリする際に、フィルターを使用してフィルター条件を満たす行のみを返すことができます。
フィルターには、SingleColumnCondition と CompositeColumnCondition が含まれます。
SingleColumnCondition: 参照列の値のみに基づいて、行を返すかどうかを決定します。
CompositeColumnCondition: 複数の参照列の値に対するフィルター条件の組み合わせに基づいて、行を返すかどうかを決定します。
制限事項
フィルター条件は、関係演算子 (=、!=、>、>=、<、および <=) と論理演算子 (NOT、AND、および OR) をサポートしています。フィルター条件には、最大 10 個のサブ条件を含めることができます。
フィルターで使用される参照列は、返される列に含まれている必要があります。そうでない場合、フィルターは参照列の値をクエリできません。
GetRow、BatchGetRow、および GetRange 操作にフィルターを使用する場合、これらの操作のネイティブのセマンティクスまたは制限は影響を受けません。
GetRange 操作を呼び出す場合、最大 5,000 行または 4 MB のデータを同時にスキャンできます。
スキャンされた 5,000 行または 4 MB のデータがフィルター条件を満たさない場合、レスポンスの行は空になります。ただし、next_start_primary_key パラメーターは空ではない場合があります。この場合、パラメーター値が空になるまで、next_start_primary_key パラメーターを使用してデータの読み取りを続行する必要があります。
パラメーター
パラメーター | 説明 |
column_name | フィルターで使用される参照列の名前。 |
column_value | フィルターで使用される参照列の値。 |
ComparatorType | フィルターで使用される関係演算子。関係演算子の詳細については、ComparatorType を参照してください。 以下の関係演算子がサポートされています: EQUAL (=), NOT_EQUAL (!=), GREATER_THAN (>), GREATER_EQUAL (>=), LESS_THAN (<), LESS_EQUAL (<=)。 |
LogicOperator | フィルターで使用される論理演算子。論理演算子の詳細については、LogicalOperator を参照してください。 以下の論理演算子がサポートされています: NOT、AND、OR。 |
pass_if_missing | 行に参照列が存在しない場合に、行を返すかどうかを指定します。このパラメーターのデータ型はブール値です。デフォルト値は True で、行に参照列が存在しない場合に、行が返されることを指定します。 pass_if_missing パラメーターを False に設定し、行に参照列が存在しない場合、行は返されません。 |
latest_version_only | 参照列に複数のバージョンのデータが含まれている場合に、比較のために参照列の最新バージョンのみを使用するかどうかを指定します。このパラメーターのデータ型はブール値です。デフォルト値は True で、参照列に複数のバージョンのデータが含まれている場合に、最新バージョンのみが比較に使用されることを指定します。 latest_version_only パラメーターを False に設定し、参照列に複数のバージョンのデータが含まれている場合、列内のすべてのバージョンのデータが比較に使用されます。この場合、少なくとも 1 つのバージョンのデータがフィルター条件を満たすと、行が返されます。 |
例
SingleColumnCondition を使用してデータをフィルタリングする
次のサンプルコードは、データテーブルから行を読み取る方法の例を示しています。この例では、最新バージョンのデータが読み取られ、name 列の値に基づいてデータがフィルタリングされます。
def get_row_with_condition(client):
# 読み取る行のプライマリキーを指定します。
primary_key = [('uid',1), ('gid',101)]
# 返す列を指定します。返す列を指定しない場合は、すべての列が返されます。
columns_to_get = []
# name 列の値が Hangzhou の場合に、行が返されるように指定します。
cond = SingleColumnCondition("name", 'Hangzhou', ComparatorType.EQUAL, pass_if_missing = True)
consumed, return_row, next_token = client.get_row('Sampletable', primary_key, columns_to_get, cond, 1)
print('Read succeed, consume %s read cu.' % consumed.read)
print('Value of primary key: %s' % return_row.primary_key)
print('Value of attribute: %s' % return_row.attribute_columns)
for att in return_row.attribute_columns:
print('name:%s\tvalue:%s\ttimestamp:%d' % (att[0], att[1], att[2]))
CompositeColumnCondition を使用してデータをフィルタリングする
次のサンプルコードは、データテーブルから行を読み取る方法の例を示しています。この例では、growth 列と name 列の値に対するフィルター条件の組み合わせに基づいてデータがフィルタリングされます。
def get_row_with_composite_condition(client):
# 読み取る行のプライマリキーを指定します。
primary_key = [('uid',1), ('gid',101)]
# 返す列を指定します。返す列を指定しない場合は、すべての列が返されます。
columns_to_get = []
# growth 列の値が 0.9 かつ name 列の値が Hangzhou の場合に、行が返されるように指定します。
cond = CompositeColumnCondition(LogicalOperator.AND)
cond.add_sub_condition(SingleColumnCondition("growth", 0.9, ComparatorType.EQUAL))
cond.add_sub_condition(SingleColumnCondition("name", 'Hangzhou', ComparatorType.EQUAL))
consumed, return_row, next_token = client.get_row('Sampletable', primary_key, columns_to_get, cond, 1)
print('Read succeed, consume %s read cu.' % consumed.read)
print('Value of primary key: %s' % return_row.primary_key)
print('Value of attribute: %s' % return_row.attribute_columns)
for att in return_row.attribute_columns:
print('name:%s\tvalue:%s\ttimestamp:%d' % (att[0], att[1], att[2]))
参照
アプリケーションが異なる属性列をクエリ条件として使用してデータをクエリする必要がある場合は、属性列をセカンダリインデックスのプライマリキー列として指定できます。このようにして、セカンダリインデックスを使用して、属性列に基づいてデータをクエリできます。これにより、データクエリが高速化されます。詳細については、セカンダリインデックスを参照してください。
ビジネスで多次元クエリとデータ分析が必要な場合は、検索インデックスを作成し、必要な属性を検索インデックスのフィールドとして指定できます。その後、検索インデックスを使用してデータをクエリおよび分析できます。たとえば、検索インデックスを使用して、非プライマリキー列、ブールクエリ、あいまいクエリに基づいてクエリを実行できます。また、検索インデックスを使用して、最大値と最小値を取得したり、行数の統計を収集したり、クエリ結果をグループ化したりすることもできます。詳細については、検索インデックスを参照してください。