从变量传递 Dexie 集合

Passing Dexie collection from variable

我有这个代码 (Indexeddb/Dexie)

db1.RestrictionsImport.where('idx').equals(n).toArray().then(function(x){...})

这很好用,但我有大量 "Restrictions" 的集合,我必须对其执行搜索。 如果我这样做:

var collection= ['RestrictionsImport','RestrictionsPrice','RestrictionsCountry','RestrictionsPart',...etc]
db1.collection[0].where('idx').equals(n).toArray().then(function(x){...})

它崩溃了:

index.html:251 Uncaught TypeError: Cannot read property 'where' of undefined at index.html:251   (anonymous) @ index.html:251

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

一些建议?

提前致谢, H.D.

根据您的数据变化,我可能会建议使用单个 table 'restrictions' 并将限制类型设置为 属性(我们称之为 'type' ).

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

您的查询可能类似于:

db.restrictions.where('[type+idx]`).equals (['country', n])

您需要将复合索引视为一个包含两项的数组。例如,如果您的年龄为 属性,您希望索引和搜索类型 == 'person' 且年龄 > 25 的项目,请执行:

db restrictions.where('[type+age]`).between (
    ['person', 25],
    ['person', Infinity]) 

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

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

是的。 db.tables 是要访问的 属性 以获得定义的 tables:

的数组
db.tables.forEach(table => {
    console.log(table.name);
});

A table 是 Dexie.Table

的实例

例如,如果您需要将一个新项目放入每个 table,请执行:

Promise.all(db.tables.map(table => table.put(newItem)))
  .then(...)
  .catch(...)

以上代码也可以在交易中使用:

db.transaction('rw', db.tables, () => {
  return Dexie.Promise.all(db.tables.map(table => {
    return table.put(newItem);
  }));
}).then({
  ...
}).catch({
  ...
});