在IndexedDB中进行多键查询(类似于sql中的OR)

问题描述 投票:3回答:3

我在标签上有一个多条目索引的商店。

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

我有一个多条目索引的存储,并且我有一个查询,也有一个标签列表,我需要在查询中获取所有包含一个标签的记录(类似于SQL OR语句)。

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

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

目前我找不到任何其他的解决方案,除了在查询中遍历标签,然后通过存储中的每个标签进行搜索。

有没有更好的解决方案?

谢谢你。

javascript indexeddb
3个回答
1
投票

除了迭代之外,你不可能通过一个查询检索到所有结果。你可以通过从最低值到最高值打开一个索引来优化搜索结果。

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

你可以使用其他的Indexed -db功能来打开多个查询,当查询完成后再合并结果。这种方式会比迭代快很多。


0
投票

IndexedDB只有Deni Mf回答的范围查询。

OR查询只是多个查询的联合。这也许是可以的。

如果你想要高效的查询,你必须对游标进行迭代,并根据需要寻找游标的位置。使用 我的图书馆,它将是

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后,我们才会得到所有的主键,才会检索出结果。

© www.soinside.com 2019 - 2024. All rights reserved.