索引の読取り

表の索引を使用して表の行を取得するには、Store.indexIterator()を使用します。表の主キーを使用して表の行を読み取るためにTableIteratorを使用する場合と同様に、索引を使用して読み取る場合、フィールド範囲、トラバース方向などのオプションを設定できます。デフォルトでは、索引スキャンはFORWARD順にエントリを返します。

たとえば、次のような表を定義したとします。

CREATE TABLE myTable (
    surname STRING,
    familiarName STRING,
    userID STRING,
    phonenumber STRING,
    address STRING,
    email STRING,
    dateOfBirth STRING,
    PRIMARY KEY (SHARD(surname, familiarName), userID)
) 
CREATE INDEX DoB ON myTable (dateOfBirth) 

これにより、dateOfBirthフィールドの値に基づいて表myTableDoBという名前の索引が作成されます。 索引をスキャンするには、次の手順を実行します。

...
// Store handle configuration and open skipped for brevity
...

store.on('open', function () {
   console.log('Store opened');

   store.indexIterator('myTable', 'DoB', {},
           function (err, iterator) {
                if (err)
                    throw err;
                else {

                    // Configure Iterator event done
                    iterator.on('done', function() {
                        store.close();
                    });

                    console.log("Retrieved rows:");

                    iterator.forEach(function (err, returnRow) {
                        if (err)
                            throw err;
                        else
                            console.log(returnRow.row);
                            console.log('\n');
                    });
                }
           });
}).on('close', function() {
    console.log('Store closed.');
}).on('error', function(error) {
    console.log(error);
});
store.open(); 

前述の例では、コードはDoB索引で索引付けされたすべての行を調べます。さらに便利なことに、この場合の例では、フィールド範囲の使用によって返される行を制限することになります。これは、FieldRangeオブジェクトを構築することで行います。これを行うには、範囲の基になるフィールドを指定する必要があります。索引は複数の表フィールドに基づくことができるため、オブジェクトを指定するフィールド名は索引付けされたフィールドの1つである必要があります。

たとえば、行がyyyy-mm-ddの形式で日付を保持している場合、次のように1994年5月に生まれたすべての人を取得できます。この索引では、1つのフィールドdateOfBirthのみが調べられるため、フィールド名をFieldRangeオブジェクトに渡します。

...
// Store handle configuration and open skipped for brevity
...

store.on('open', function () {
   console.log('Store opened');

   var fieldRange = new nosqldb.Types.FieldRange(
                "dateOfBirth", "1994-05-01", true,
                "1994-05-30", true);

   store.indexIterator('myTable', 'DoB', {
            fieldRange: fieldRange
           },
           function (err, iterator) {
                if (err)
                    throw err;
                else {

                    // Configure Iterator event done
                    iterator.on('done', function() {
                        store.close();
                    });

                    console.log("Retrieved rows:");

                    iterator.forEach(function (err, returnRow) {
                        if (err)
                            throw err;
                        else
                            console.log(returnRow.row);
                            console.log('\n');
                    });
                }
           });
}).on('close', function() {
    console.log('Store closed.');
}).on('error', function(error) {
    console.log(error);
});
store.open();