これは少しトリッキーですが、できます。私のライブラリhttps://bitbucket.org/ytkyaw/ydn-dbで説明しますが、IndexedDB API を使用できます。
最初に、配列 keyPath を使用して複合インデックス (Firefox と Chrome のみサポート) を使用する必要があります。ydn-db のデータベース スキーマは
var schema = {
stores: [{
name: 'book',
indexes: [{
name: 'author, pages',
keyPath: ['author', 'pages']
}]
}
};
var db = new ydn.db.Storage('db name', schema);
インデックスは、'author, pages'
でソートされauthor
、次に でソートされpages
ます。次に、カーソルを準備するか、ydn-db にイテレータを作成します。
var iter = new ydn.db.IndexValueIterator('book', 'author, pages');
デフォルトでは、順序は昇順です。ここでは、降順でページの最高値を取得します。これにより、作成者はうっかり降順でソートしてしまいますが、これを回避する方法はありません。
iter = iter.reverse().unique(); // essentially 'PREV_UNIQUE'
次に、降順でカーソルを生成するイテレータを開きます。最初のカーソルが必要です。次の反復では、著者名の重複をスキップします。これはcursor.continue(next_key)
メソッドを使用して行われます。next_key
既知の作成者キーで可能な限り低い値を与えることによって、すでに得られたものを繰り返さないように与えられます。
db.open(function(cursor) {
var book = cursor.getValue();
console.log(book);
var effective_key = cursor.getKey();
var author_key = effective_key[0];
var next_key = [author_key];
return next_key; // continue to this or lower than this key.
}, iter);
一意の作成者のみを反復処理するだけでよく、バッファ メモリは必要ないため、スケーラブルであることに注意してください。