データの削除

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

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

表から行を削除するには、次のようにします。
/* 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に基づいて行のセットを削除します。このオプションは、一方の(部分キーには含まれない)主キー・フィールドの値の範囲を指定します。
次のいずれかの方法を使用して、表から行を削除します。NosqlRepository deleteById()delete()deleteAll(Iterable<? extends T> entities)deleteAll()またはNosqlTemplate delete()deleteAll()deleteById()deleteInShard()を使用します。詳細は、SDK for Spring Data APIリファレンスを参照してください。

ノート:

まず、Oracle NoSQL Databaseの接続詳細を指定するために、AbstractNosqlConfigurationクラスを拡張するAppConfigクラスを作成します。詳細は、「NoSQL接続の取得」を参照してください。

この項では、NosqlRepository deleteAll()メソッドを使用して表から行を削除します。

UsersRepositoryインタフェースを作成します。このインタフェースは、NosqlRepositoryインタフェースを拡張して、そのクラスの主キーのエンティティ・クラスとデータ型をパラメータ化された型としてNosqlRepositoryインタフェースに提供します。NosqlRepositoryインタフェースは、データベースからデータを取得するために使用されるメソッドを備えています。
import com.oracle.nosql.spring.data.repository.NosqlRepository;
 
/* The Users is the entity class and Long is the data type of the primary key in the Users class.
   This interface provides methods that return iterable instances of  the Users class. */
 
public interface UsersRepository extends NosqlRepository<Users, Long> {
    Iterable<Users> findAll();
}
アプリケーションでは、deleteAll()メソッドを使用して、表から既存の行を削除します。
@Autowired
private UsersRepository repo;
 
/* Delete all the existing rows if any, from the Users table.*/
repo.deleteAll();