Javascript Indexeddb:在运行前索引名未知时,从多个索引获取数据

Javascript Indexeddb:在运行前索引名未知时,从多个索引获取数据,javascript,html,indexeddb,Javascript,Html,Indexeddb,我有一个indexedDb,它有以下索引 objectStore.createIndex('course', 'course', {unique: false}); objectStore.createIndex('year', 'year', {unique: false}); objectStore.createIndex('session', 'session', {unique: false}); objectStore.createIndex('rollnumber', 'rollnu

我有一个indexedDb,它有以下索引

objectStore.createIndex('course', 'course', {unique: false});
objectStore.createIndex('year', 'year', {unique: false});
objectStore.createIndex('session', 'session', {unique: false});
objectStore.createIndex('rollnumber', 'rollnumber', {unique: false});
objectStore.createIndex('name', 'name', {unique: false});
现在我有了一个表单,其中包含了所有上述索引的字段。用户填写表单,我必须根据用户填写的字段过滤结果。因此,如果用户只填写
课程
会话
字段,那么我必须返回与这两个索引匹配的所有对象

关系版本会很简单

SELECT * FROM college WHERE session = ? AND course = ?
我可以根据用户填写的字段准备查询。但在indexedDb中,我需要事先知道组合,这对于这么多不同的可能组合是不可能的

对于上述情况,将需要类似的内容

objectStore.createIndex('courseSession', ['course', 'session'], {unique: false});
这一切都很好,但这不是唯一可能的组合,用户可以填写任何数量的字段,它想缩小结果。那么我该如何做到这一点呢?我无法写出这5个字段的2^5(或任何可能的组合)

我发现了一个相关的问题。但这并不能解决我不知道需要什么组合的问题,所以我不能提前创建索引

TL;DR:我事先不知道要在数据存储中“搜索”哪些索引,因此无法创建索引

从会话=?当然=

这并不意味着在
课程
课程
上有索引。即使没有索引,它也能工作。在IndexedDB中也可以这样做,只需在整个数据库中搜索与约束匹配的对象

我无法写出这5个字段的2^5(或任何可能的组合)

实际上是10种可能的组合。所以其实没那么多。您可以尝试添加所有可能的组合


替代策略:用户输入2个(或更多)约束条件,您只需对其中一个约束条件建立索引,然后手动搜索所有结果以查找其他约束条件。

这是一个正确的答案,但如果能以某种好的方式更清楚,那就更好了。这可能是阿克沙第一次接触到这个概念。这个答案指出的是,您也没有在SQL中使用索引。但我认为真正要问的是如何快速查询多个属性,有索引或没有索引。答案是,除非您想要更好的性能,否则您不需要索引。只需迭代所有对象并过滤掉不需要的对象。如果您想使用索引,请了解NOSQL中的查询计划。所以你基本上说的是手动操作?比如将所有数据加载到一个数组中,然后过滤我想要的内容。那不是我所期望的。但我想我能应付。@Josh你说得没错,这是我第一次使用NoSQL数据库。我会读更多的。谢谢是的,基本的简单方法是迭代。您可以对每次成功回调进行迭代,这样您就不需要预加载到数组中,然后对其进行迭代,但是如果您避免使用数组技术,则需要在回调中编写每次迭代代码,该回调作为异步调用的结果,对于刚学过这些东西的人来说,这也更复杂。是的,这是糟糕的表现。更好的方法,也是indexedDB的预期使用方法,是使用索引。但现在,您在具体情况下遇到了一个非常复杂的问题,即(复合)索引如何工作。有关在您的具体情况下使用复合索引将面临问题的原因的解释,请参阅。