条件付き更新機能を使用すると、指定した条件を満たす場合にのみデータテーブル内のデータを更新できます。条件が満たされない場合、更新は失敗します。
前提条件
-
OTSClient インスタンスが初期化されていること。詳細については、「OTSClient インスタンスの初期化」をご参照ください。
-
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、「データテーブルの作成」および「データの書き込み」をご参照ください。
注意事項
PutRow、UpdateRow、DeleteRow、または BatchWriteRow API を呼び出してデータを更新する場合、条件付き更新を使用して行の存在条件とカラム条件を確認できます。条件が満たされる場合にのみ更新に成功します。
条件付き更新は、行の存在条件とカラム条件に基づいて実行できます。
-
行の存在条件には、IGNORE、EXPECT_EXIST、EXPECT_NOT_EXIST があります。
データテーブルを変更する際、Tablestore は最初に行の存在条件を確認します。行の存在条件が満たされない場合、変更は失敗し、エラーが返されます。
-
カラム条件には SingleColumnCondition と CompositeCondition があり、これらは 1 つ以上のカラムの値に基づいて条件が満たされるかどうかを判定します。
カラム条件では、次の関係演算子を使用できます:=、!=、>、>=、<、<=。カラム条件では、次の論理演算子も使用できます:NOT、AND、OR。条件付き更新では、最大 10 個のカラム条件を指定できます。
-
SingleColumnCondition は、定数とカラムの比較に対応しています。SingleColumnCondition は、2 つのカラム同士の比較、および 2 つの定数同士の比較には対応していません。
-
論理演算子は、CompositeCondition 内のサブ条件を組み合わせるために使用されます。サブ条件には SingleColumnCondition または CompositeCondition を指定できます。
-
条件付き更新を使用して、オプティミスティックロックを実行できます。行を更新する場合は、特定のカラムの値を取得し、そのカラム値に基づいて行の更新条件を指定する必要があります。たとえば、ある行のカラム A の値を 2 に更新する場合は、カラム A の値を取得する必要があります。この例では、取得した値は 1 です。次に、カラム A の値が 1 の場合にのみ行が更新されるように指定する必要があります。指定した条件が満たされると、更新に成功します。 別のクライアントによって行が更新された場合、更新は失敗します。
パラメーター
|
パラメーター |
説明 |
|
RowExistenceExpectation |
行の存在条件。テーブルを変更する際、Tablestore は行の存在条件を確認します。行の存在条件が満たされない場合、変更は失敗し、エラーが返されます。 行の存在条件には IGNORE、EXPECT_EXIST、EXPECT_NOT_EXIST があります。Tablestore では、IGNORE は RowExistenceExpectation_IGNORE、EXPECT_EXIST は RowExistenceExpectation_EXPECT_EXIST、EXPECT_NOT_EXIST は RowExistenceExpectation_EXPECT_NOT_EXIST を使用して指定します。
|
|
columnName |
カラム名。 |
|
columnValue |
列の比較値。 |
|
comparator |
カラム値を比較するために使用する関係演算子。関係演算子の種類については、「ComparatorType」をご参照ください。 関係演算子には EQUAL (=)、NOT_EQUAL (!=)、GREATER_THAN (>)、GREATER_EQUAL (>=)、LESS_THAN (<)、LESS_EQUAL (<=) があります。Tablestore では、EQUAL (=) は CT_EQUAL、NOT_EQUAL (!=) は CT_NOT_EQUAL、GREATER_THAN (>) は CT_GREATER_THAN、GREATER_EQUAL (>=) は CT_GREATER_EQUAL、LESS_THAN (<) は CT_LESS_THAN、LESS_EQUAL (<=) は CT_LESS_EQUAL を使用して指定します。 |
|
combinator |
複数の条件を結合する論理演算子。論理演算子の種類については、「LogicalOperator」をご参照ください。 論理演算子には NOT、AND、OR があります。Tablestore では、NOT は LO_NOT、AND は LO_AND、OR は LO_OR を使用して指定します。 指定できるサブ条件の数は、使用する論理演算子によって異なります。
|
|
passIfMissing |
行にカラムが存在しない場合に、条件チェックをパスするかどうかを指定します。このパラメーターの値はブール型です。デフォルト値は true で、行にカラムが存在しない場合でも条件チェックがパスされ、行が更新条件を満たすことを意味します。 passIfMissing パラメーターを false に設定し、かつ行にカラムが存在しない場合、条件チェックは失敗し、行は更新条件を満たしません。 |
|
latestVersionOnly |
カラムに複数バージョンの値がある場合に、比較で最新バージョンの値のみを使用するかどうかを指定します。このパラメーターの値はブール型です。デフォルト値は true で、カラムに複数バージョンの値がある場合、比較に最新バージョンの値のみを使用することを意味します。 latestVersionOnly パラメーターを false に設定し、かつカラムに複数バージョンの値がある場合、すべてのバージョンの値が比較に使用されます。この場合、少なくとも 1 つのバージョンが条件を満たすと、条件チェックがパスされ、行は更新条件を満たします。 |
例
指定したプライマリキーに基づいて行を更新します。指定した行が存在し、"name" カラムの値が "john" で、かつ "addr" カラムの値が "china" の場合、更新に成功します。それ以外の場合、更新に失敗します。
var params = {
tableName: "sampleTable",
primaryKey: [{ 'gid': Long.fromNumber(20013) }, { 'uid': Long.fromNumber(20013) }],
updateOfAttributeColumns: [{ 'PUT': [{ 'col1': 'test6' }] }]
};
// 更新条件を指定します。指定した行が存在し、"name" カラムの値が "john"、かつ "addr" カラムの値が "china" である場合にのみ、データが更新されるようにします。
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.condition = new TableStore.Condition(TableStore.RowExistenceExpectation.EXPECT_EXIST, condition);
client.updateRow(params,
function (err, data) {
if (err) {
console.log('error:', err);
return;
}
console.log('success:', data);
});