Tablestore フィルターはサーバー上でクエリ結果をフィルタリングし、フィルタリングされた結果を返します。フィルター条件を満たす行のみが返されます。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれます。詳細については、データテーブルの作成とデータの書き込みを参照してください。
使用上の注意
GetRow、BatchGetRow、または GetRange 操作を呼び出してデータをクエリする場合、フィルターを使用してフィルター条件を満たす行のみを返すことができます。
フィルターには、RelationalCondition と CompositeCondition が含まれます。
RelationalCondition: 参照列の値のみに基づいて行をフィルタリングするかどうかを決定します。
CompositeCondition: 複数の参照列の値のフィルター条件を組み合わせて、行をフィルタリングするかどうかを決定します。
フィルターの詳細については、フィルターの構成を参照してください。
制限事項
フィルター条件は、関係演算子 (=、!=、>、>=、<、および <=) と論理演算子 (NOT、AND、および OR) をサポートしています。フィルター条件には、最大 10 個のサブ条件を含めることができます。
フィルターで使用される参照列は、返される列に含まれている必要があります。そうでない場合、フィルターは参照列の値をクエリできません。
GetRow、BatchGetRow、および GetRange 操作にフィルターを使用する場合、これらの操作のネイティブセマンティクスまたは制限は影響を受けません。
GetRange 操作を呼び出す場合、最大 5,000 行または 4 MB のデータを同時にスキャンできます。
スキャンされた 5,000 行または 4 MB がフィルター条件と一致しない場合、レスポンスの行は空になります。ただし、nextStartPrimaryKey は空でない場合があります。この場合、nextStartPrimaryKey が空になるまで、nextStartPrimaryKey を使用してデータの読み取りを続ける必要があります。
パラメーター
パラメーター | 説明 |
ColumnName | フィルターで使用される参照列の名前。 |
ColumnValue | フィルターで使用される参照列の値。 |
ComparatorType | フィルターで使用される関係演算子。関係演算子の詳細については、ComparatorType を参照してください。 以下の関係演算子がサポートされています: EQUAL (=), NOT_EQUAL (!=), GREATER_THAN (>), GREATER_EQUAL (>=), LESS_THAN (<), LESS_EQUAL (<=)。 |
LogicOperator | フィルターで使用される論理演算子。論理演算子の詳細については、LogicalOperator を参照してください。 以下の論理演算子がサポートされています: NOT、AND、OR。 |
PassIfMissing | 行に参照列が存在しない場合に、行を返すかどうかを指定します。パラメーター値のデータ型はブール値です。デフォルト値は true で、行に参照列が存在しない場合、行が返されることを示します。 PassIfMissing が false に設定されている場合、行に参照列が存在しない場合、行は返されません。 |
LatestVersionsOnly | 参照列に複数バージョンのデータが含まれている場合、比較に参照列の最新バージョンのみを使用するかどうかを指定します。このパラメーターの値は Bool 型です。デフォルト値は true です。デフォルト値が使用されている場合、参照列に複数バージョンのデータが含まれている場合、最新バージョンのデータが比較に使用されます。 LatestVersionsOnly の値が false に設定されている場合、参照列のすべてのバージョンのデータが比較に使用されます。参照列の 1 つのバージョンのデータがフィルター条件を満たす場合、行が返されます。 |
例
RelationalCondition を使用してデータをフィルタリングする
次のサンプルコードは、RelationalCondition を使用してデータテーブルからデータを読み取り、col0 列の値に基づいてデータをフィルタリングする方法を示しています。
public void GetRowWithRelationalCondition(OTSClient otsClient)
{
// 行のプライマリキーを指定します。プライマリキーは、テーブルの作成時に TableMeta で指定されたプライマリキーと同じである必要があります。
PrimaryKey primaryKey = new PrimaryKey
{
{ "pk0", new ColumnValue(0) },
{ "pk1", new ColumnValue("abc") }
};
var rowQueryCriteria = new SingleRowQueryCriteria(TableName)
{
RowPrimaryKey = primaryKey
};
// col0 の値が 5 の場合に、行が返されるように指定します。
var filter = new RelationalCondition("col0",CompareOperator.EQUAL,new ColumnValue(5))
{
PassIfMissing = true
};
rowQueryCriteria.Filter = filter.ToFilter();
rowQueryCriteria.AddColumnsToGet("col0");
rowQueryCriteria.AddColumnsToGet("col1");
GetRowRequest request = new GetRowRequest(rowQueryCriteria);
// クエリを実行します。
GetRowResponse response = otsClient.GetRow(request);
PrimaryKey primaryKeyRead = response.PrimaryKey;
AttributeColumns attributesRead = response.Attribute;
Console.WriteLine("読み取られたプライマリキー: ");
foreach (KeyValuePair<string, ColumnValue> entry in primaryKeyRead)
{
Console.WriteLine(entry.Key + ":" + PrintColumnValue(entry.Value));
}
Console.WriteLine("読み取られた属性: ");
foreach (KeyValuePair<string, ColumnValue> entry in attributesRead)
{
Console.WriteLine(entry.Key + ":" + PrintColumnValue(entry.Value));
}
Console.WriteLine("フィルターを使用した行の取得に成功しました。");
}
CompositeCondition を使用してデータをフィルタリングする
次のサンプルコードは、CompositeCondition を使用して、col0==0 OR col1=="ff"
という条件を満たすデータを読み取る方法を示しています。
public void GetRowWithCompositeCondition(OTSClient otsClient)
{
// 行のプライマリキーを指定します。プライマリキーは、テーブルの作成時に TableMeta で指定されたプライマリキーと同じである必要があります。
PrimaryKey primaryKey = new PrimaryKey
{
{ "pk0", new ColumnValue(0) },
{ "pk1", new ColumnValue("abc") }
};
var rowQueryCriteria = new SingleRowQueryCriteria(TableName)
{
RowPrimaryKey = primaryKey
};
// col0 の値が 5 であるか、col1 の値が ff でない場合に、行が返されるように指定します。
var filter1 = new RelationalCondition("col0",
CompareOperator.EQUAL,
new ColumnValue(5));
var filter2 = new RelationalCondition("col1", CompareOperator.NOT_EQUAL, new ColumnValue("ff"));
var filter = new CompositeCondition(LogicOperator.OR);
filter.AddCondition(filter1);
filter.AddCondition(filter2);
rowQueryCriteria.Filter = filter.ToFilter();
rowQueryCriteria.AddColumnsToGet("col0");
rowQueryCriteria.AddColumnsToGet("col1");
GetRowRequest request = new GetRowRequest(rowQueryCriteria);
// クエリを実行します。
GetRowResponse response = otsClient.GetRow(request);
PrimaryKey primaryKeyRead = response.PrimaryKey;
AttributeColumns attributesRead = response.Attribute;
Console.WriteLine("読み取られたプライマリキー: ");
foreach (KeyValuePair<string, ColumnValue> entry in primaryKeyRead)
{
Console.WriteLine(entry.Key + ":" + PrintColumnValue(entry.Value));
}
Console.WriteLine("読み取られた属性: ");
foreach (KeyValuePair<string, ColumnValue> entry in attributesRead)
{
Console.WriteLine(entry.Key + ":" + PrintColumnValue(entry.Value));
}
Console.WriteLine("フィルターを使用した行の取得に成功しました。");
}
関連情報
アプリケーションが異なる属性列をクエリ条件として使用してデータをクエリする必要がある場合は、属性列をセカンダリインデックスのプライマリキー列として指定できます。このようにして、セカンダリインデックスを使用して、属性列に基づいてデータをクエリできます。これにより、データクエリが高速化されます。詳細については、セカンダリインデックスを参照してください。
ビジネスで多次元クエリとデータ分析が必要な場合は、検索インデックスを作成し、必要な属性列を検索インデックスのフィールドとして指定できます。その後、検索インデックスを使用してデータをクエリおよび分析できます。たとえば、検索インデックスを使用して、非プライマリキー列、ブールクエリ、およびあいまいクエリに基づいてクエリを実行できます。また、検索インデックスを使用して、最大値と最小値を取得したり、行数の統計を収集したり、クエリ結果をグループ化したりすることもできます。詳細については、検索インデックスを参照してください。
SQL クエリ機能を使用して、テーブル内のデータをクエリおよび分析できます。詳細については、データのクエリを参照してください。