首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IndexedDB中的多键查询(类似于sql中的OR )

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

Stack Overflow用户
提问于 2013-01-04 04:27:07
回答 2查看 3.1K关注 0票数 3

我在标签上有multiEntry索引的商店。

代码语言:javascript
运行
复制
{ tags: [ 'tag1', 'tag2', 'tag3' ] }

我还查询了标签列表。

代码语言:javascript
运行
复制
[ 'tag2', 'tag1', 'tag4' ]

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

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

有没有更好的解决方案?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-04 14:28:58

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

代码语言:javascript
运行
复制
IDBKeyRange.bound ('tag1', 'tag4');

您可以使用的其他索引数据库功能是打开多个查询,并在查询完成时组合结果。这种方式将比迭代快得多。

票数 1
EN

Stack Overflow用户

发布于 2013-01-04 16:23:50

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

或者查询仅仅是多个查询的联合。这可能是可以的。

如果您想要高效的查询,您必须根据需要迭代游标并查找游标位置。使用my library,它将是

代码语言:javascript
运行
复制
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);
   }
});

请注意,该算法没有误报检索。首先执行Key only查询,这样我们就不会浪费在反序列化上。只有在删除耗尽后,我们才能获得所有主键,才能检索结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14146671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档