最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Indexed DB cursor ranges on multiple properties - Stack Overflow

programmeradmin0浏览0评论

I have a composite index of two properties on an indexeddb objectstore and wish to retrieve a cursor based on the range of both of these properties.

Here's an example object in the store :

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

and index :

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

The index creation is succesful and I can see it in the Chrome developer tools, however now I'd like to open a cursor with a keyrange on both the x and y co-ordinates (which will be the extent of a map).

Searching online I can't see how to do this, and opening an index with an array of key ranges doesn't seem to work.

I have a composite index of two properties on an indexeddb objectstore and wish to retrieve a cursor based on the range of both of these properties.

Here's an example object in the store :

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

and index :

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

The index creation is succesful and I can see it in the Chrome developer tools, however now I'd like to open a cursor with a keyrange on both the x and y co-ordinates (which will be the extent of a map).

Searching online I can't see how to do this, and opening an index with an array of key ranges doesn't seem to work.

Share Improve this question edited Mar 3, 2019 at 5:54 Cœur 38.7k26 gold badges202 silver badges277 bronze badges asked May 13, 2013 at 12:30 keskes 3303 silver badges10 bronze badges 4
  • Have you tried IDBKeyRange.bound([lowX,lowY],[highX,highY]) ? Just a wild guess. – Myrne Stol Commented May 13, 2013 at 14:51
  • Thanks Meryn - that was it, if you'd like to post as an answer I can accept it. – kes Commented May 14, 2013 at 8:42
  • Hmmm must be my lucky day! :) I have posted the solution as an answer. – Myrne Stol Commented May 14, 2013 at 10:07
  • See also stackoverflow.com/questions/12084177/… – Myrne Stol Commented May 16, 2013 at 15:46
Add a comment  | 

3 Answers 3

Reset to default 8

The range suggestion is part of the answer, but even with array keys it really is just a 1-dimensional range, not a 2- (or N-) dimensional selection of the data. With your current schema you'll need to do something like this:

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();
    }
};

(if coordinates are not integral, replace + 1 with an appropriate epsilon)

I've posted an example of a generalized solution to:

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

I have been told the solution is indeed IDBKeyRange.bound([lowX,lowY],[highX,highY]).

The index you created is a composite index. It is query like this:

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

Alternatively, you can use two indexes for each coorrd. In my opinion it is better.

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
发布评论

评论列表(0)

  1. 暂无评论