2013-05-13 9 views
6

私はindexeddbオブジェクトストアに2つのプロパティの複合インデックスを持ち、これらのプロパティの両方の範囲に基づいてカーソルを取得したいと考えています。複数のプロパティのインデックス付きDBカーソル範囲

{species: 'Oak',xcoord: 123456, ycoord: 654321} 

とインデックス::ここで

は、例えば、ストア内のオブジェクトです

treeStore.createIndex("treelocation", ["xcoord","ycoord"], { unique: false }); 

インデックスの作成が成功していると私は、しかし、今、私がしたい、Chromeデベロッパーツールでそれを見ることができますx座標とy座標の両方のキーレンジ(これはマップの範囲になります)でカーソルを開くのが好きです。

オンライン検索私はこれを行う方法がわかりませんし、キー範囲の配列でインデックスを開くことは機能していないようです。

アンドリュー

+0

は、あなたが '' IDBKeyRange.bound([lowX、ローウィ]、[highX、highY])を試したことがありますか?ちょうど野生の推測。 –

+0

ありがとうございました。私はそれを受け入れることができる答えとして投稿したいと思っています。 – kes

+0

Hmmmは私の幸運な日でなければなりません! :)答えとして解決策を掲載しました。 –

答えて

6

私は解決策が実際にIDBKeyRange.bound([lowX,lowY],[highX,highY])であると言われています。

+3

期待通りに動作しません。 IDBKeyRange.bound([2,2]、[4,4])の範囲には、[2,2] <[3,0] <[3,0]と[3,0] 3,5] <[4,4]キーの定義(https://w3c.github.io/IndexedDB/#key-construct) つまり、追加のフィルタリングを行う必要があります。ソリューション自体が不十分です。例えばキー[x、y_less_than_min]が見えたら、それを無視して 'continue([x、lowY])'でカーソルを進めてください。キー[x、y_greater_than_max]が見えたら、それを無視して 'continue([x + 1、lowY])'でカーソルを進める –

4

おかげで、作成したインデックスは複合インデックスです。

index = objectStore.index('treelocation'); 
index.get([123456, 654321]); 

また、各coorrdに2つのインデックスを使用できます。私の意見ではそれは良いです。

x_index = objectStore.index('xcoord'); 
y_index = objectStore.index('ycoord'); 
x_species = x_index.get(IDBKeyRange.only(123456)) 
y_species = y_index.get(IDBKeyRange.only(654321)) 
species = x_species.intersect(y_species); // this is result 
+1

ありがとうKyaw - これは私が1つの場所でレコードを取得するだけでしたが、xとyは地理的座標です。両方の範囲を1つ取得するため、複合インデックスを取得することを検討しています。 – kes

1

レンジ提案は答えの一部ですが、配列キーを使用しても実際には1次元の範囲であり、データの2次元(またはN)次元の選択ではありません。

index.openCursor([lowX, lowY], [highX, highY]).onsuccess = function(e) { 
    var cursor = e.target.result; 
    if (!cursor) return; // done! 

    var x = cursor.key[0], y = cursor.key[1]; 
    // assert(lowX <= x && x <= highX); 
    if (y < lowY) { 
     cursor.continue([x, lowY]); 
    } else if (y > highY) { 
     cursor.continue([x + 1, lowY]); 
    } else { 
     processRecord(cursor.value); // we got one! 
     cursor.continue(); 
    } 
}; 

を(座標が整数でない場合、適切なイプシロンと+ 1を置き換える)私は一般的な解決策の例とを掲載しました:現行のスキーマを使用すると、このような何かをする必要があります:

https://gist.github.com/inexorabletash/704e9688f99ac12dd336