0

レコードの述語に基づいて、ストア内の次の一意のインデックスを取得する方法はありますか。たとえば、次のようなオブジェクトでいっぱいの書店があるとします。

{name: 'Hello Kitty', author: 'Me', pages: 5}

次の一意のインデックスを著者に返すことは可能ですが、一意性は最大数のページに基づいていますか?

index.openKeyCursor('author', IDBCursor.nextunique).onsuccess = function(event) {
  var cursor = event.target.result;
  if (cursor) {
    // How to filter the record by highest number of pages?
    cursor.continue();
  }
};
4

1 に答える 1

0

これは少しトリッキーですが、できます。私のライブラリ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);

一意の作成者のみを反復処理するだけでよく、バッファ メモリは必要ないため、スケーラブルであることに注意してください。

于 2013-10-23T05:09:40.707 に答える