Tablestoreでは、インデックステーブルから単一のデータ行、またはプライマリキー値が特定の範囲内にあるデータを読み取ることができます。インデックステーブルに返したい属性列が含まれている場合は、インデックステーブルを読み取ってデータを取得できます。そうでない場合は、インデックステーブルが作成されたデータテーブルからデータをクエリする必要があります。
前提条件
OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスの初期化を参照してください。
セカンダリインデックスが作成されていること。詳細については、セカンダリインデックスの作成を参照してください。
使用上の注意
インデックステーブルはデータの読み取りにのみ使用できます。
返したい属性列がインデックステーブルに含まれていない場合は、必要な属性列を取得するために、インデックステーブルが作成されたデータテーブルからデータをクエリする必要があります。
単一のデータ行を読み取る
GetRow操作を呼び出して、単一のデータ行を読み取ることができます。詳細については、単一のデータ行を読み取るを参照してください。
パラメーター
GetRow操作を呼び出してインデックステーブルからデータを読み取る場合は、次の点に注意してください。
tableNameパラメーターをインデックステーブルの名前に設定する必要があります。
Tablestoreは、インデックス列として指定されていないデータテーブルのプライマリキー列を、インデックステーブルのプライマリキー列としてインデックステーブルに自動的に追加します。したがって、インデックステーブルの行のプライマリキー列を指定する場合は、インデックステーブルを作成する基になるインデックス列とデータテーブルのプライマリキー列を指定する必要があります。
例
次のサンプルコードは、行のプライマリキーに基づいてインデックステーブルのデータ行を読み取る方法の例を示しています。
public static void GetRowfromIndex()
{
OTSClient otsClient = Config.GetClient();
// プライマリキーを構築します。プライマリキーを構築する際は、インデックス列として指定されていないデータテーブルのプライマリキー列を指定する必要があります。
PrimaryKey primaryKey = new PrimaryKey
{
{ "col0", new ColumnValue(0) },
{ "pk1", new ColumnValue(0) },
{ "pk2", new ColumnValue("abc") }
};
try
{
// クエリリクエストオブジェクトを構築します。属性列が指定されていない場合は、行全体が読み取られます。
var request = new GetRowRequest(IndexName, primaryKey);
// GetRow操作を呼び出してデータをクエリします。
var response = otsClient.GetRow(request);
Console.WriteLine("Primary Key: " + response.PrimaryKey);
Console.WriteLine("Attribute Column: " + response.Columns[0]);
// 例外が返されない場合、操作は成功です。
Console.WriteLine("Get row succeeded.");
}
catch (Exception ex)
{
// 例外が返された場合、操作は失敗です。例外を処理します。
Console.WriteLine("Get row failed, exception:{0}", ex.Message);
}
}
プライマリキー値が特定の範囲内にあるデータを読み取る
GetRange操作を呼び出して、プライマリキー値が特定の範囲内にあるデータを読み取ることができます。詳細については、プライマリキー値が特定の範囲内にあるデータを読み取るを参照してください。
パラメーター
GetRange操作を呼び出してインデックステーブルからデータを読み取る場合は、次の点に注意してください。
tableNameパラメーターをインデックステーブルの名前に設定する必要があります。
Tablestoreは、インデックス列として指定されていないデータテーブルのプライマリキー列を、インデックステーブルのプライマリキー列としてインデックステーブルに自動的に追加します。したがって、クエリする範囲の開始プライマリキーと終了プライマリキーを指定する場合は、インデックステーブルを作成する基になるインデックス列とデータテーブルのプライマリキー列を指定する必要があります。
例
次のサンプルコードは、インデックステーブルからプライマリキー値が特定の範囲内にあるデータを読み取る方法の例を示しています。この例では、インデックステーブルの最初のプライマリキー列はcol1です。範囲に指定されたcol1列の値は0です。
public static void GetRangeFromIndexTable()
{
Console.WriteLine("Start getRange from index...");
OTSClient otsClient = Config.GetClient();
// 最初のプライマリキー列col1の値を指定してデータをスキャンします。
PrimaryKey inclusiveStartPrimaryKey = new PrimaryKey
{
{ "col1", new ColumnValue(0) },
{ "pk1", ColumnValue.INF_MIN },
{ "pk2", ColumnValue.INF_MIN }
};
PrimaryKey exclusiveEndPrimaryKey = new PrimaryKey
{
{ "col1", new ColumnValue(0) },
{ "pk1", ColumnValue.INF_MAX },
{ "pk2", ColumnValue.INF_MAX }
};
GetRangeRequest request = new GetRangeRequest(IndexName, GetRangeDirection.Forward, inclusiveStartPrimaryKey, exclusiveEndPrimaryKey);
GetRangeResponse response = otsClient.GetRange(request);
IList<Row> rows = response.RowDataList;
PrimaryKey nextStartPrimaryKey = response.NextPrimaryKey;
while (nextStartPrimaryKey != null)
{
request = new GetRangeRequest(TableName, GetRangeDirection.Forward, nextStartPrimaryKey, exclusiveEndPrimaryKey);
response = otsClient.GetRange(request);
nextStartPrimaryKey = response.NextPrimaryKey;
foreach (var row in response.RowDataList)
{
rows.Add(row);
}
}
foreach (var row in rows)
{
PrintRow(row);
}
Console.WriteLine("TotalRowsRead: " + rows.Count);
}
private static void PrintRow(Row row)
{
Console.WriteLine("-----------------");
foreach (KeyValuePair<string, ColumnValue> entry in row.GetPrimaryKey())
{
Console.WriteLine(entry.Key + ":" + entry.Value);
}
foreach (Column entry in row.GetColumns())
{
Console.WriteLine(entry.Name + ":" + entry.Value);
}
Console.WriteLine("-----------------");
}
FAQ
関連情報
ビジネスで多次元クエリとデータ分析が必要な場合は、検索インデックスを作成し、必要な属性を検索インデックスのフィールドとして指定できます。その後、検索インデックスを使用してデータのクエリと分析を実行できます。たとえば、検索インデックスを使用して、非プライマリキー列、ブールクエリ、あいまいクエリに基づいてクエリを実行できます。また、検索インデックスを使用して、最大値と最小値を取得したり、行数の統計を収集したり、クエリ結果をグループ化したりすることもできます。詳細については、検索インデックスを参照してください。
SQLステートメントを実行してデータのクエリと分析を行う場合は、SQLクエリ機能を使用できます。詳細については、SQLクエリを参照してください。