Tablestoreは、データを読み取るための複数の操作を提供します。GetRow操作を呼び出して単一のデータ行を読み取ったり、BatchGetRow操作を呼び出して一度に複数のデータ行を読み取ったり、GetRange操作を呼び出して主キー値が指定された範囲内にあるデータを読み取ったりできます。
クエリメソッド
Tablestoreは、データを読み取るためのGetRow、BatchGetRow、およびGetRange操作を提供します。データを読み取る前に、実際のクエリシナリオに基づいて適切なクエリメソッドを選択してください。
自動インクリメント主キー列を含むテーブルからデータを読み取る場合は、自動インクリメント主キー列の値を含むすべての主キー列の値をクエリしたことを確認してください。詳細については、自動インクリメント主キー列の設定を参照してください。自動インクリメント主キー列に値が記録されていない場合は、GetRange操作を呼び出して、最初の主キー列の主キー値に基づいてデータが読み取られる範囲を指定できます。
クエリメソッド | 説明 | シナリオ |
GetRow操作を呼び出して、単一のデータ行を読み取ることができます。 | このメソッドは、テーブルのすべての主キー列を決定でき、読み取る行数が少ないシナリオに適用できます。 | |
BatchGetRow操作を呼び出して、1つ以上のテーブルから一度に複数のデータ行を読み取ることができます。 BatchGetRow操作は、複数のGetRow操作で構成されます。サブ操作を構築するプロセスは、GetRow操作を呼び出すプロセスと同じです。 | このメソッドは、テーブルのすべての主キー列を決定でき、読み取る行数が多い場合、または複数のテーブルからデータを読み取るシナリオに適用できます。 | |
GetRange操作を呼び出して、主キー値が指定された範囲内にあるデータを読み取ることができます。 GetRange操作を使用すると、主キー値が指定された範囲内にあるデータを前方または後方に読み取ることができます。読み取る行数を指定することもできます。範囲が広く、スキャンされた行数またはスキャンされたデータの量が上限を超えると、スキャンは停止し、読み取られた行と次の行の主キーに関する情報が返されます。前回の操作が中断したところからリクエストを開始し、前回の操作によって返された次の行の主キー情報に基づいて残りの行を読み取ることができます。 | このメソッドは、テーブルのすべての主キー列の範囲または主キー列のプレフィックスを決定できるシナリオに適用できます。 重要 主キー列のプレフィックスを決定できない場合は、データがINF_MINタイプの開始主キー列と、データがINF_MAXタイプの終了主キー列を指定して、テーブルのすべての主キー列の範囲を決定できます。この操作はテーブル内のすべてのデータをスキャンしますが、大量の計算リソースを消費します。注意して進めてください。 |
前提条件
OTSClientインスタンスが初期化されています。詳細については、OTSClientインスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれます。詳細については、データテーブルの作成およびデータの書き込みを参照してください。
単一のデータ行の読み取り
GetRow操作を呼び出して、単一のデータ行を読み取ることができます。GetRow操作を呼び出すと、次のいずれかの結果が返される場合があります。
行が存在する場合、行の主キー列と属性列が返されます。
行が存在しない場合、行は返されず、エラーも報告されません。
API操作
/*
* 指定された主キー情報に基づいて単一のデータ行を読み取ります。
*/
getRow(params, callback)
パラメーター
パラメーター | 説明 |
tableName | テーブルの名前。 |
primaryKey | 行の主キー情報。主キー情報は、主キー列名、主キータイプ、および主キー値で構成されます。 重要 指定する主キー列の数とタイプは、テーブル内の実際の主キー列の数とタイプと同じである必要があります。 |
columnsToGet | 読み取る列。主キー列または属性列の名前を指定できます。
説明
|
maxVersions | 読み取ることができるデータバージョンの最大数。 重要 maxVersionsパラメーターとtimeRangeパラメーターの少なくとも一方を指定する必要があります。
|
timeRange | 読み取るバージョンの時間範囲、または特定のバージョン。詳細については、TimeRangeを参照してください。 重要 maxVersionsパラメーターとtimeRangeパラメーターの少なくとも一方を指定する必要があります。
specific_timeと timeRangeパラメーターの有効な値:0~ |
columnFilter | サーバー側でクエリ結果をフィルタリングするために使用するフィルター。フィルター条件を満たす行のみが返されます。詳細については、フィルターの設定を参照してください。 説明 columnsToGetパラメーターとcolumnFilterパラメーターの両方を指定した場合、TablestoreはcolumnsToGetパラメーターで指定された列をクエリし、フィルター条件を満たす行を返します。 |
サンプルコード
次のサンプルコードは、データ行を読み取る方法の例を示しています。
var TableStore = require('../index.js');
var Long = TableStore.Long;
var client = require('./client');
var params = {
tableName: "sampleTable",
primaryKey: [{ 'gid': Long.fromNumber(20004) }, { 'uid': Long.fromNumber(20004) }],
maxVersions: 2 // 読み取ることができるデータバージョンの最大数を指定します。値2は、最大2つのバージョンのデータを読み取ることができることを指定します。
};
var condition = new TableStore.CompositeCondition(TableStore.LogicalOperator.AND);
condition.addSubCondition(new TableStore.SingleColumnCondition('name', 'john', TableStore.ComparatorType.EQUAL));
condition.addSubCondition(new TableStore.SingleColumnCondition('addr', 'china', TableStore.ComparatorType.EQUAL));
params.columnFilter = condition;
client.getRow(params, function (err, data) {
if (err) {
console.log('error:', err);
return;
}
console.log('success:', data);
});
詳細なサンプルコードを表示するには、GetRow@GitHubにアクセスしてください。
一度に複数のデータ行の読み取り
BatchGetRow操作を呼び出して、1つ以上のテーブルから一度に複数のデータ行を読み取ることができます。BatchGetRow操作は、複数のGetRow操作で構成されます。BatchGetRow操作を呼び出す場合、各GetRow操作を構築するプロセスは、GetRow操作を呼び出すときにGetRow操作を構築するプロセスと同じです。
BatchGetRow操作を呼び出すと、各GetRow操作は個別に実行され、Tablestoreは各GetRow操作へのレスポンスを個別に返します。
使用上の注意
BatchGetRow操作を呼び出して一度に複数の行を読み取ると、一部の行の読み取りに失敗する場合があります。この場合、Tablestoreは例外を返さず、失敗した行に関する情報が含まれているBatchGetRowResponseを返します。したがって、BatchGetRow操作を呼び出すときは、戻り値をチェックして、各行からデータが正常に読み取られたかどうかを確認する必要があります。
BatchGetRow操作は、すべての行に同じパラメーター設定を使用します。たとえば、
ColumnsToGet
パラメーターが[colA]に設定されている場合、colA列の値のみがすべての行から読み取られます。BatchGetRow操作を呼び出して、一度に最大100行を読み取ることができます。
API操作
/**
* 1つ以上のテーブルから一度に複数のデータ行を読み取ります。
*/
batchGetRow(params, callback)
パラメーター
GetRow操作と比較して、BatchGetRow操作には次の変更があります。
テーブルの階層が作成されます。複数のテーブルのデータを一度に読み取ることができます。
tablesパラメーターを使用して、読み取り操作を実行するテーブルと行に関する情報を指定できます。
primaryKeyパラメーターを使用すると、複数の行の主キー情報を指定し、複数の行から一度にデータを読み取ることができます。
説明行の主キー情報を指定するときは、主キー列名、主キータイプ、および主キー値を指定し、主キー情報がテーブルに存在することを確認する必要があります。主キー情報がテーブルに存在しない場合、レスポンス内の主キー情報に対応する行データは空になります。
サンプルコード
次のサンプルコードは、一度に複数のテーブルからデータを読み取り、エラーが発生した場合に読み取り操作を再試行する方法の例を示しています。
var client = require('./client');
var TableStore = require('../index.js');
var Long = TableStore.Long;
var params = {
tables: [{
tableName: 'sampleTable',
primaryKey: [
[{ 'gid': Long.fromNumber(20013) }, { 'uid': Long.fromNumber(20013) }],
[{ 'gid': Long.fromNumber(20015) }, { 'uid': Long.fromNumber(20015) }]
],
startColumn: "col2",
endColumn: "col4"
},
{
tableName: 'notExistTable',
primaryKey: [
[{ 'gid': Long.fromNumber(10001) }, { 'uid': Long.fromNumber(10001) }]
]
}
],
};
var maxRetryTimes = 3;
var retryCount = 0;
function batchGetRow(params) {
client.batchGetRow(params, function (err, data) {
if (err) {
console.log('error:', err);
return;
}
var isAllSuccess = true;
var retryRequest = { tables: [] };
for (var i = 0; i < data.tables.length; i++) {
var failedRequest = { tableName: data.tables[i][0].tableName, primaryKey: [] };
for (var j = 0; j < data.tables[i].length; j++) {
if (!data.tables[i][j].isOk && null != data.tables[i][j].primaryKey) {
isAllSuccess = false;
var pks = [];
for (var k in data.tables[i][j].primaryKey) {
var name = data.tables[i][j].primaryKey[k].name;
var value = data.tables[i][j].primaryKey[k].value;
var kp = {};
kp[name] = value;
pks.push(kp);
}
failedRequest.primaryKey.push(pks);
} else {
// 成功データの取得
}
}
if (failedRequest.primaryKey.length > 0) {
retryRequest.tables.push(failedRequest);
}
}
if (!isAllSuccess && retryCount++ < maxRetryTimes) {
batchGetRow(retryRequest);
}
console.log('success:', data);
});
}
batchGetRow(params, maxRetryTimes);
詳細なサンプルコードを表示するには、BatchGetRow@GitHubにアクセスしてください。
主キー値が特定の範囲内にあるデータの読み取り
GetRange操作を呼び出して、主キー値が指定された範囲内にあるデータを読み取ることができます。
GetRange操作を使用すると、主キー値が指定された範囲内にあるデータを前方または後方に読み取ることができます。読み取る行数を指定することもできます。範囲が広く、スキャンされた行数またはスキャンされたデータの量が上限を超えると、スキャンは停止し、読み取られた行と次の行の主キーに関する情報が返されます。前回の操作が中断したところからリクエストを開始し、前回の操作によって返された次の行の主キー情報に基づいて残りの行を読み取ることができます。
Tablestoreテーブルでは、すべての行が主キーでソートされます。テーブルの主キーは、すべての主キー列で順番に構成されます。したがって、行は特定の主キー列に基づいてソートされません。
使用上の注意
GetRange操作は、左端一致の原則に従います。 Tablestoreは、最初の主キー列から最後の主キー列まで順番に値を比較して、主キー値が指定された範囲内にあるデータを読み取ります。たとえば、データテーブルの主キーは、PK1、PK2、およびPK3という主キー列で構成されます。データを読み取るとき、Tablestoreは最初に、行のPK1値が最初の主キー列に指定された範囲内にあるかどうかを判断します。行のPK1値が範囲内にある場合、Tablestoreは、行の他の主キー列の値が各主キー列に指定された範囲内にあるかどうかの判断を停止し、行を返します。行のPK1値が範囲内にない場合、Tablestoreは、PK1と同じ方法で、行の他の主キー列の値が各主キー列に指定された範囲内にあるかどうかを判断し続けます。
次のいずれかの条件が満たされると、GetRange操作が停止してデータが返される場合があります。
スキャンされたデータ量が4 MBに達する。
スキャンされた行数が5,000に達する。
返される行数が上限に達する。
予約済みの読み取りスループットがすべて消費されているため、読み取りスループットが次のデータ行を読み取るのに不十分である。
API操作
/**
* 主キー値が指定された範囲内にあるデータを読み取ります。
*/
getRange(params, callback)
パラメーター
パラメーター | 説明 |
tableName | テーブルの名前。 |
direction | レスポンス内の行をソートする順序。
たとえば、テーブルにAとBという2つの主キー値があり、値Aは値Bよりも小さいとします。 directionパラメーターをFORWARDに設定し、テーブルに |
inclusiveStartPrimaryKey | 読み取る範囲の開始主キー情報と終了主キー情報。開始主キー列と終了主キー列は、有効な主キー列、またはデータがINF_MINタイプとINF_MAXタイプの仮想列である必要があります。仮想列で指定された範囲の列数は、指定されたテーブルの主キー列の数と同じである必要があります。 INF_MINは無限に小さい値を示します。他のすべてのタイプの値は、INF_MINタイプの値よりも大きくなります。 INF_MAXは無限に大きい値を示します。他のすべてのタイプの値は、INF_MAXタイプの値よりも小さくなります。
テーブル内の行は、主キー値に基づいて昇順でソートされます。データの読み取りに使用される範囲は、左閉右開区間です。データが順方向に読み取られる場合、主キー値が開始主キー値以上で終了主キー値未満の行が返されます。 |
exclusiveEndPrimaryKey | |
limit | 返される行の最大数。このパラメーターの値は0より大きくする必要があります。 Tablestoreは、指定された範囲内の一部の行が返されない場合でも、順方向または逆方向に返される行の最大数に達すると操作を停止します。レスポンスで返されるnextStartPrimaryKeyパラメーターの値を使用して、次のリクエストでデータを読み取ることができます。 |
columnsToGet | 読み取る列。主キー列または属性列の名前を指定できます。
説明
|
maxVersions | 読み取ることができるデータバージョンの最大数。 重要 maxVersionsパラメーターとtimeRangeパラメーターの少なくとも一方を指定する必要があります。
|
timeRange | 読み取るバージョンの時間範囲、または特定のバージョン。詳細については、TimeRangeを参照してください。 重要 maxVersionsパラメーターとtimeRangeパラメーターの少なくとも一方を指定する必要があります。
specific_timeと timeRangeパラメーターの有効な値:0~ |
columnFilter | サーバー側でクエリ結果をフィルタリングするために使用するフィルター。フィルター条件を満たす行のみが返されます。詳細については、フィルターの設定を参照してください。 説明 columnsToGetパラメーターとcolumnFilterパラメーターの両方を指定した場合、TablestoreはcolumnsToGetパラメーターで指定された列をクエリし、フィルター条件を満たす行を返します。 |
nextStartPrimaryKey | 次の読み取りリクエストの開始主キー情報。 nextStartPrimaryKeyパラメーターの値を使用して、すべてのデータが読み取られたかどうかを判断できます。
|
サンプルコード
次のサンプルコードは、主キー値が指定された範囲内にあるデータを読み取る方法の例を示しています。
var Long = TableStore.Long;
var client = require('./client');
var params = {
tableName: "sampleTable",
direction: TableStore.Direction.FORWARD,
inclusiveStartPrimaryKey: [{ "gid": TableStore.INF_MIN }, { "uid": TableStore.INF_MIN }],
exclusiveEndPrimaryKey: [{ "gid": TableStore.INF_MAX }, { "uid": TableStore.INF_MAX }],
limit: 50
};
client.getRange(params, function (err, data) {
if (err) {
console.log('error:', err);
return;
}
// data.next_start_primary_keyパラメーターの値が空でない場合、システムはデータの読み取りを続けます。
if (data.next_start_primary_key) {
}
console.log('success:', data);
});
詳細なサンプルコードを表示するには、GetRange@GitHubにアクセスしてください。