IndexedDB中的多个键查询(类似于sql中的OR)

时间:2013-01-03 20:27:07

标签: javascript indexeddb

我在标签上存储了multiEntry索引。

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

我还查询了标签列表。

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

我需要获取包含查询中的一个标记的所有记录(类似于SQL OR语句)。

目前我找不到任何其他解决方案,除了在查询中迭代标签并按商店中的每个标签搜索。

有没有更好的解决方案?

谢谢。

2 个答案:

答案 0 :(得分:1)

除迭代外,您无法使用一个查询检索所有结果。您可以通过打开从最低值到最高值的索引来优化搜索结果:

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

您可以使用的其他Indexed-Db功能是打开多个查询并在查询完成时合并结果。这种方式比迭代要快得多。

答案 1 :(得分:0)

当Deni Mf回答时,IndexedDB只有范围查询。

OR查询只是多个查询的联合。那可能没问题。

如果需要高效查询,则必须迭代光标并根据需要搜索光标位置。使用my library,它将是

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

请注意,该算法没有误报检索。首先执行仅关键查询,这样我们就不会浪费去除。检索结果只有在删除了deplicates后我们才能获得所有主键。