データの読取り

表からデータを読み取る方法について学習します。

言語固有のドライバに対して様々なAPIメソッドを使用して、アプリケーションからデータを読み取ることができます。単一の主キー値に基づいて、または問合せを使用してレコードを取得できます。

ノート:

まず、クライアント・ドライバをOracle NoSQL Databaseに接続し、接続してから他のステップを実行します。このトピックでは、クライアント・ドライバの接続と表の作成に関するステップは省略しています。

GetRequestクラスでは、簡単かつ強力な方法でデータを読み取ることができますが、より複雑な読取りリクエストには問合せを使用できます。表からデータを読み取るには、GetRequestクラスを使用してターゲット表とターゲット・キーを指定し、NoSQLHandle.get()を使用してリクエストを実行します。この操作の結果はGetResultで参照できます。

表からデータを読み取るには、次のようにします。

/* GET the row, first create the row key */
MapValue key = new MapValue().put("id", 1);
GetRequest getRequest = new GetRequest().setKey(key)
                                        .setTableName("users");
GetResult getRes = handle.get(getRequest);

/* on success, GetResult.getValue() returns a non-null value */
if (getRes.getValue() != null) {
  // success
} else {
  // failure
}

ノート:

デフォルトでは、すべての読取り操作で最終的に整合性が維持されます。NoSQLHandleインスタンスのデフォルトの整合性を変更するには、NoSQLHandleConfig.setConsistency(oracle.nosql.driver.Consistency)メソッドとGetRequest.setConsistency()メソッドを使用します。

GET APIの詳細は、Java APIリファレンス・ガイドを参照してください。

表からデータを読み取る方法について学習します。borneo.NoSQLHandle.get()メソッドを使用して単一行を読み取ることができます。このメソッドを使用すると、主キー値に基づいてレコードを取得できます。borneo.GetRequestクラスは、単純なget操作に使用されます。ターゲット行の主キー値が含まれ、borneo.GetResultのインスタンスを返します。
from borneo import GetRequest
# GetRequest requires a table name 
request = GetRequest().set_table_name('users')
# set the primary key to use request.set_key({'id': 1})
result = handle.get(request)
# on success the value is not empty
if result.get_value() is not None:
# success

デフォルトでは、borneo.Consistency.EVENTUALを使用して、すべての読取り操作で最終的に整合性が維持されます。このタイプの読取りは、絶対的な整合性borneo.Consistency.ABSOLUTEを使用する読取りよりもコストが低くなります。このデフォルトは、ハンドルを作成する前に、borneo.NoSQLHandleConfig.set_consistency()を使用してborneo.NoSQLHandleで変更できます。borneo.GetRequest.set_consistency()を使用して、単一のリクエストで変更できます。

Client.Get関数を使用して単一行を読み取ることができます。この関数を使用すると、主キー値に基づいてレコードを取得できます。nosqldb.GetRequestは、単純なget操作に使用されます。これにはターゲット行の主キー値が含まれ、nosqldb.GetResultのインスタンスを返します。get操作が成功すると、nil以外のGetResult.Versionが返されます。
key:=&types.MapValue{}
key.Put("id", 1)
req:=&nosqldb.GetRequest{
    TableName: "users",
    Key: key,
}
res, err:=client.Get(req)
デフォルトでは、types.Eventualを使用して、すべての読取り操作で最終的に整合性が維持されます。このタイプの読取りは、絶対的な整合性types.Absoluteを使用する読取りよりもコストが低くなります。このデフォルトは、クライアントを作成する前に、RequestConfig.Consistencyを使用してnosqldb.RequestConfigで変更できます。GetRequest.Consistencyフィールドを使用して、単一のリクエストで変更できます。
  1. すべての読取り操作のデフォルトの整合性を変更します。
    cfg:= nosqldb.Config{
      RequestConfig: nosqldb.RequestConfig{
            Consistency: types.Absolute,
            ...
        },
        ...
    }
    client, err:=nosqldb.NewClient(cfg)
  2. 単一読取り操作の整合性を変更します。
    req:=&nosqldb.GetRequest{
        TableName: "users",
        Key: key,
        Consistency: types.Absolute,
    }

getメソッドを使用して単一行を読み取ることができます。このメソッドを使用すると、主キー値に基づいてレコードを取得できます。整合性列挙を使用して、読取り操作の整合性を設定できます。デフォルトでは、Consistency.EVENTUALを使用して、すべての読取り操作で最終的に整合性が維持されます。このタイプの読取りは、絶対的な整合性Consistency.ABSOLUTEを使用する読取りよりもコストが低くなります。この読取り操作のデフォルトの整合性は、consistencyプロパティを使用してNoSQLClientインスタンスを作成するために使用される初期構成で設定できます。また、getメソッドのopt引数にconsistencyプロパティを設定して、単一の読取り操作でこれを変更することもできます。

getメソッドは、結果の行とそのバージョンを含むプレーンJavaScriptオブジェクトであるGetResultのPromiseを返します。指定された主キーが表に存在しない場合、rowプロパティの値はnullになります。指定された主キーのキー・オブジェクトのプロパティ名は、基礎となる表の列名と同じである必要があります。
const NoSQLClient = require('oracle-nosqldb').NoSQLClient;
const Consistency = require('oracle-nosqldb').Consistency;
const client = new NoSQLClient('config.json'); 
async function getRowsFromUsersTable() { 
   const tableName = 'users'; 
   try {
      let result = await client.get(tableName,  
      { id: 1 });
      console.log('Got row: ' + result.row);
      // Use absolute consistency 
      result = await client.get(tableName, 'users', 
         { id: 1 }, { consistency: Consistency.ABSOLUTE }); 
      console.log('Got row with absolute consistency: ' + result.row);
   } 
   catch(error){
      //handle errors
   }
}

GetAsyncメソッドを使用して単一行を読み取ることができます。このメソッドを使用すると、主キー値に基づいて行を取得できます。このメソッドは、主キー値をMapValueとして取得します。フィールド名は、表の主キー列名と同じである必要があります。オプションをGetOptionsとして渡すこともできます。

Consistency列挙を使用して、読取り操作の整合性を設定できます。デフォルトでは、すべての読取り操作で最終的に整合性が維持されます。このタイプの読取りは、絶対的な整合性を使用する読取りよりもコストが低くなります。読取り操作のデフォルトの整合性は、NoSQLConfigのConsistencyプロパティとして設定できます。GetOptionsのConsistencyプロパティを使用して、単一のGet操作の一貫性を変更することもできます。

GetAsyncメソッドはTask<GetResult<RecordValue>>を返します。GetResultインスタンスには、返される行、行バージョンおよびその他の情報が含まれています。指定された主キーを持つ行が表に存在しない場合、行プロパティとバージョン・プロパティの両方の値がnullになります。
var client = new NoSQLClient("config.json");
..................................................
var tableName = "users";
try{
    var result = await client.GetAsync(tableName,
        new MapValue
        {
            ["id"] =1
        });
    // Continuing from the Put example, the expected output will be:
    // { "id": 1, "name": "Kim" }
    Console.WriteLine("Got row: {0}", result.row);
    // Use absolute consistency.
    result = await client.GetAsync(tableName,
        new MapValue
        {
            ["id"] =2
        }),
         new GetOptions
         {
            Consistency=Consistency.Absolute
         });
   // The expected output will be:
   // { "id": 2, "name": "Jack" }
   Console.WriteLine("Got row with absolute consistency: {0}",
        result.row);
  // Continuing from the Put example, the expiration time should be
  // 30 days from now.
  Console.WriteLine("Expiration time: {0}", result.ExpirationTime)
}
catch(Exception ex){
  // handle exceptions
}
次のいずれかの方法を使用して、表NosqlRepository findById()findAllById()findAll()から、またはNosqlTemplate find()findAll()findAllById()を使用してデータを読み取ります。詳細は、SDK for Spring Data APIリファレンスを参照してください。

ノート:

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

この項では、NosqlRepository findAll()メソッドを使用します。

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();
}
アプリケーションでは、Users表からすべての行を選択し、反復可能なインスタンスに指定します。反復可能オブジェクトからの出力に値を出力します。
@Autowired
private UsersRepository repo;
 
/* Select all the rows in the Users table and provides them into an iterable instance.*/
 
System.out.println("\nfindAll:");
Iterable < Users > allusers = repo.findAll();
 
/* Print the values to the output from the iterable object.*/
for (Users u: allusers) {
    System.out.println(" User: " + u);
}
プログラムを実行して出力を表示します。
findAll:

User: Users{id=1, firstName=John, lastName=Doe}
User: Users{id=2, firstName=Angela, lastName=Willard}