Multiple keys query in IndexedDB (Similar to OR in sql)

我只是一个虾纸丫 提交于 2020-05-13 07:56:10

问题


I have store with multiEntry index on tags.

{ tags: [ 'tag1', 'tag2', 'tag3' ] }

And i have query that also list of tags.

[ 'tag2', 'tag1', 'tag4' ]

I need to get all records which contain one of tag in query (Similar to SQL OR statement).

Currently I cannot find any other solution except iterate over tags in query and search by the each tag in the store.

Is there any better solution?

Thank you.


回答1:


You cannot retrieve all results with one query except with iteration. You can optimize the search result by opening a index from the lowest value to the highest:

IDBKeyRange.bound ('tag1', 'tag4');

Other Indexed-Db feature you can use is to open multiple queries and combine the result when the queries complete. This way would be much faster than the iteration.




回答2:


IndexedDB has only range query as Deni Mf answered.

OR query is simply union of multiple queries. That may be OK.

If you want efficient query, you have to iterate the cursor and seek the cursor position as necessary. Using my library, it will be

tags = ['tag2', 'tag1', 'tag4'];
tags.sort();
iter = new ydn.db.KeyIterator('store name', 'tags', IDBKeyRange.bound(tags[0], tags[tags.length-1]);
keys = [];
i = 0; 
var req = db.open(iter, function(cursor) {
  if (tags.indexOf(cursor.indexKey()) >= 0) {
      // we got the result
     if (keys.indexOf(cursor.key()) == -1) { // remove duplicate
       keys.push(cursor.key());
     }
  } else {
     return tags[++i]; // jump to next index position.
  }
);

req.done(function() {
  db.list('store name', keys).done(function(results) {
     console.log(results);
   }
});

Notice that the algorithm has no false positive retrieval. Key only query is performed first, so that we don't waste on de-serilization. The results is retrieved only we get all the primary keys after removing deplicates.



来源:https://stackoverflow.com/questions/14146671/multiple-keys-query-in-indexeddb-similar-to-or-in-sql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!