表の行の反復使用

Store.tableIterator()では、非アトミック表の反復を実行できます。

Store.tableIterator()は、行のセット全体を一度に返しません。かわりに、イテレータ内の行のフェッチをバッチ処理し、使用可能な帯域幅を独占することなく、ネットワーク往復を最小限にします。また、このメソッドで返される行はソートされていません。

このメソッドでは1つの原子的操作にならないことに注意してください。取得がバッチ処理されるため、取得操作全体を行ううちに戻りセットが変更されることがあります。その結果、このメソッドを使用する場合、操作の原子性が失われます。

このメソッドでは、表内の行の未ソート走査を行えます。キーを指定しない場合、このメソッドは表のすべての行を反復します。

このメソッドを使用する場合、オプションで次のものを指定できます。

  • FieldRangeオブジェクト。指定したキーに対して取得される値の範囲を定義します。

  • 反復に含める親表と祖先表のリスト。

  • ReadOptionsオブジェクト。操作の一貫性ポリシーおよび操作にかかる時間の上限を指定できます。一貫性ポリシーについては、一貫性保証を参照してください

  • 反復の方向。FORWARDおよびREVERSEがサポートされています。

たとえば、次のように設計されている製品に関する情報を格納する表があるとします。

CREATE TABLE myTable (
    itemType STRING,
    itemCategory STRING,
    itemClass STRING,
    itemColor STRING,
    itemSize STRING,
    price FLOAT,
    inventoryCount INTEGER,
    PRIMARY KEY (SHARD(itemType, itemCategory, itemClass), itemColor,
    itemSize)
) 

次のようなデータを含む表:

  • 行1:

    • itemType: Hats

    • itemCategory: baseball

    • itemClass: longbill

    • itemColor: red

    • itemSize: small

    • price: 12.07

    • inventoryCount: 127

  • 行2:

    • itemType: Hats

    • itemCategory: baseball

    • itemClass: longbill

    • itemColor: red

    • itemSize: medium

    • price: 13.07

    • inventoryCount: 201

  • 行3:

    • itemType: Hats

    • itemCategory: baseball

    • itemClass: longbill

    • itemColor: red

    • itemSize: large

    • price: 14.07

    • inventoryCount: 39

  • n:

    • itemType: Coats

    • itemCategory: Casual

    • itemClass: Winter

    • itemColor: red

    • itemSize: large

    • price: 247.99

    • inventoryCount: 9

最も簡単な例では、次のようにStore.tableIterator()を使用して「Hats」に関連するすべての行を取得できます。この単純な例は、Store.multiGet()メソッドを使用して実行することもできます。完全なシャード・キーがあり、結果セット全体がメモリーにおさまる場合、multiGet()tableIterator()よりも効率よく実行されます。ただし、結果セット全体がメモリーにおさまらない場合、または完全なシャード・キーがない場合、tableIterator()の方が優れた選択肢となります。tableIterator()を使用して実行される読取りは非原子的で、更新中のレコードに対して長時間の繰り返しを実行している場合には悪影響がある可能性があります。

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

// Open the store with the specified configuration
var store = nosqldb.createStore(configuration);

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

   var key = {itemType: "Hats"};

   store.tableIterator('myTable', key, null,
           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();