首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从变量传递Dexie集合

从变量传递Dexie集合
EN

Stack Overflow用户
提问于 2017-07-13 01:48:42
回答 2查看 1.2K关注 0票数 0

我有这个代码(Indexeddb/Dexie)

代码语言:javascript
复制
db1.RestrictionsImport.where('idx').equals(n).toArray().then(function(x){...})

这可以很好地工作,但我有许多具有“限制”的集合,我必须对这些集合执行搜索。如果我这样做:

代码语言:javascript
复制
var collection= ['RestrictionsImport','RestrictionsPrice','RestrictionsCountry','RestrictionsPart',...etc]
db1.collection[0].where('idx').equals(n).toArray().then(function(x){...})

它崩溃了:

代码语言:javascript
复制
index.html:251 Uncaught TypeError: Cannot read property 'where' of undefined at index.html:251   (anonymous) @ index.html:251

这一系列的限制类型可以从几个到几十个,这取决于其他查询,所以我必须将Dexie查询放在一个循环中,我不能简单地一个接一个地编写它们。

有什么建议吗?

先谢谢你,H.D。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-15 06:02:09

是。db.tables是要访问的属性,以便获取已定义表的数组:

代码语言:javascript
复制
db.tables.forEach(table => {
    console.log(table.name);
});

表是Dexie.Table的一个实例

例如,如果您需要在每个表中放入一个新项目,请执行以下操作:

代码语言:javascript
复制
Promise.all(db.tables.map(table => table.put(newItem)))
  .then(...)
  .catch(...)

上面的代码也可以在事务中使用:

代码语言:javascript
复制
db.transaction('rw', db.tables, () => {
  return Dexie.Promise.all(db.tables.map(table => {
    return table.put(newItem);
  }));
}).then({
  ...
}).catch({
  ...
});
票数 1
EN

Stack Overflow用户

发布于 2017-07-13 06:09:32

根据您的数据变体,我可能会建议使用单个表“限制”,并将限制类型作为属性(让我们称之为“类型”)。

如果您想要高效的索引,请使用type+idx的复合索引,而不只是idx。

然后,您的查询可能如下所示:

代码语言:javascript
复制
db.restrictions.where('[type+idx]`).equals (['country', n])

您需要将复合索引视为一个两项数组。例如,如果您有一个age属性,您想要索引和搜索类型为== 'person‘且age > 25的项目,请执行以下操作:

代码语言:javascript
复制
db restrictions.where('[type+age]`).between (
    ['person', 25],
    ['person', Infinity]) 

不过,不区分大小写的搜索是不可能的。

IndexedDB不是为动态添加表而设计的。这是可能的,但您需要以某种方式管理您的数据库的版本号,并记住,每次您需要添加新表时,使用同一数据库的其他选项卡将阻止您的模式更新请求,或者必须关闭并停止按预期运行。

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

https://stackoverflow.com/questions/45064466

复制
相关文章

相似问题

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