データの削除

表から行を削除する方法について学習します。

表にデータを挿入またはロードした後で、表の行が不要になった場合は削除できます。

表から行を削除するには、次のようにします。
/* identify the row to delete */
MapValue delKey = new MapValue().put("id", 2);

/* construct the DeleteRequest */
DeleteRequest delRequest = new DeleteRequest().setKey(delKey)
                                              .setTableName("users");
/* Use the NoSQL handle to execute the delete request */
DeleteResult del = handle.delete(delRequest);
/* on success DeleteResult.getSuccess() returns true */
if (del.getSuccess()) {
  // success, row was deleted
} else {
  // failure, row either did not exist or conditional delete failed
}

MultiDeleteRequestクラスを使用して、表に対して一連のDeleteRequest操作を実行できます。

次に示すように、主キー値を使用し、borneo.DeleteRequestを使用して単一行を削除します。
from borneo import DeleteRequest
# DeleteRequest requires table name and primary key
request = DeleteRequest().set_table_name('users') 
request.set_key({'id': 1})
# perform the operation
result = handle.delete(request)
if result.get_success():
# success -- the row was deleted
# if the row didn't exist or was not deleted for any other reason, False is returned

削除操作は、get操作から返されたborneo.Versionに基づいて、条件付きにできます。borneo.MultiDeleteRequestおよびborneo.NoSQLHandle.multi_delete()を使用し、値の範囲を使用して1回の操作で複数の削除を実行できます。

主キー値を使用し、nosqldb.DeleteRequestを使用して、単一行を削除します。
key := &types.MapValue{}
key.Put("id", 1)
req := &nosqldb.DeleteRequest{
    TableName: "users",
    Key: key,
}
res, err := client.Delete(req)

削除操作は、get操作から返されたtypes.Versionに基づいて条件付きにできます。

行を削除するには、deleteメソッドを使用します。削除する行の表名および主キーを渡します。また、getまたはputによって以前に返された行のバージョンを指定することで、削除操作を条件付きにできます。これをopt引数{ matchVersion: my_version }のmatchVersionプロパティとして渡すことができます。または、deleteIfVersionメソッドを使用することもできます。

deleteおよびdeleteIfVersionメソッドは、操作の成功ステータスを含むプレーンJavaScriptオブジェクトであるDeleteResultのPromiseを返します。
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
const client = new NoSQLClient('config.json');

async function deleteRowsFromUsersTable() {
    const tableName = 'users';
    try {
        let result = await client.put(tableName, { id: 1, name: 'John' });

        // Unconditional delete, should succeed
        result = await client.delete(tableName, { id: 1 });
        // Expected output: delete succeeded
        console.log('delete ' + result.success ? 'succeeded' : 'failed');

        // Delete with non-existent primary key, will fail
        result = await client.delete(tableName, { id: 2 });
        // Expected output: delete failed
        console.log('delete ' + result.success ? 'succeeded' : 'failed');

        // Re-insert the row
        result = await client.put(tableName, { id: 1, name: 'John' });
        let version = result.version;

        // Will succeed because the version matches existing row
        result = await client.deleteIfVersion(tableName, { id: 1 }, version);
        // Expected output: deleteIfVersion succeeded
        console.log('deleteIfVersion ' + result.success ?
            'succeeded' : 'failed');

        // Re-insert the row
        result = await client.put(tableName, { id: 1, name: 'John' });

        // Will fail because the last put has changed the row version, so
        // the old version no longer matches.  The result will also contain
        // existing row and its version because we specified returnExisting in
        // the opt argument.
        result = await client.deleteIfVersion(tableName, { id: 1 }, version,
            { returnExisting: true });
        // Expected output: deleteIfVersion failed
        console.log('deleteIfVersion ' + result.success ?
            'succeeded' : 'failed');
        // Expected output: { id: 1, name: 'John' }
        console.log(result.existingRow);
    } catch(error) {
        //handle errors
    }
}

put操作と同様に、successは、存在しない主キーを持つ行を削除しようとした場合、または一致するバージョンが指定されているときにバージョンが不一致の場合のみ、false値になることに注意してください。その他の理由で失敗するとエラーになります。deleteRangeメソッドを使用して、単一のアトミック操作で同じシャード・キーを持つ複数の行を削除できます。このメソッドは、部分主キー(シャード・キーまたはそのスーパーセットである必要があります)およびオプションのFieldRangeに基づいて行のセットを削除します。このオプションは、一方の(部分キーには含まれない)主キー・フィールドの値の範囲を指定します。

行を削除するには、DeleteAsyncメソッドを使用します。削除する行の表名および主キーを渡します。このメソッドは、主キー値をMapValueとして取得します。フィールド名は、表の主キー列名と同じである必要があります。オプションをDeleteOptionsとして渡すこともできます。また、以前にGetAsyncまたはPutAsyncによって返された行のRowVersionを指定することで、削除操作を条件付きにできます。照合する行バージョンを取得するDeleteIfVersionAsyncメソッドを使用します。または、DeleteAsyncメソッドを使用して、バージョンをDeleteOptionsMatchVersionプロパティとして渡すこともできます。
var client = new NoSQLClient("config.json");
var tableName = "users";
try
{
    var row = new MapValue
    {
        ["id"] = 1,
        ["name"] = "John"
    };

    var putResult = await client.PutAsync(tableName, row);
    Console.WriteLine("Put {0}.",
       putResult.Success ? "succeeded" : "failed");

    var primaryKey = new MapValue
    {
        ["id"] = 1
    };
    // Unconditional delete, should succeed.
    var deleteResult = await client.DeleteAsync(tableName, primaryKey);
    // Expected output: Delete succeeded.
    Console.WriteLine("Delete {0}.",
        deleteResult.Success ? "succeeded" : "failed");
    // Delete with non-existent primary key, should fail.
    var deleteResult = await client.DeleteAsync(tableName,
        new MapValue
        {
            ["id"] = 200
        });
    // Expected output: Delete failed.
    Console.WriteLine("Delete {0}.",
        deleteResult.Success ? "succeeded" : "failed");
    // Re-insert the row and get the new row version.
    putResult = await client.PutAsync(tableName, row);
    var version = putResult.Version;
    // Delete should succeed because the version matches existing
    // row.
    deleteResult = await client.DeleteIfVersionAsync(tableName,
        primaryKey, version);
    // Expected output: DeleteIfVersion succeeded.
    Console.WriteLine("DeleteIfVersion {0}.",
        deleteResult.Success ? "succeeded" : "failed");
    // Re-insert the row
    putResult = await client.PutAsync(tableName, row);
    // This delete should fail because the last put operation has
    // changed the row version, so the old version no longer matches.
    // The result will also contain existing row and its version because
    // we specified ReturnExisting in DeleteOptions.
    deleteResult = await client.DeleteIfVersionAsync(tableName,
        primaryKey, version);
    // Expected output: DeleteIfVersion failed.
    Console.WriteLine("DeleteIfVersion {0}.",
        deleteResult.Success ? "succeeded" : "failed");
    // Expected output: { "id": 1, "name": "John" }
    Console.WriteLine(result.existingRow);
}
catch(Exception ex) {
    // handle exceptions
}
結果のSuccessプロパティは、削除する行が見つかったかどうか、および条件付き削除について、指定されたバージョンが一致したかどうかのみを示すことに注意してください。その他の理由で削除操作が失敗した場合は、例外がスローされます。DeleteRangeAsyncメソッドを使用して、単一のアトミック操作で同じシャード・キーを持つ複数の行を削除できます。このメソッドは、部分主キー(シャード・キーを含む必要があります)およびオプションのFieldRangeに基づいて行のセットを削除します。このオプションは、一方の(部分キーには含まれない)主キー・フィールドの値の範囲を指定します。