【问题标题】:Indexeddb: Get data from multiple indexes when index names are not known before runtimeIndexeddb:在运行前不知道索引名称时从多个索引中获取数据
【发布时间】:2014-06-05 22:53:49
【问题描述】:

我有一个具有以下索引的 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});

现在我有一个包含所有上述索引字段的表单。用户填写表格,我必须根据用户填写的任何字段过滤结果。所以如果用户只填写coursesession 字段,那么我必须返回匹配这两个索引的所有对象。

关系版本很简单

SELECT * FROM college WHERE session = ? AND course = ?

我可以根据用户填写的字段准备查询。但是在 indexedDb 中,我需要事先知道组合,这对于这么多不同的可能组合是不可能的。

对于上述情况,需要这样的东西

objectStore.createIndex('courseSession', ['course', 'session'], {unique: false});

除了这不是唯一可能的组合之外,这一切都很好,很漂亮,用户可以填写任意数量的字段来缩小结果范围。那么我该如何实现呢?我不能写出这 5 个字段的 2^5(或其他)可能的组合。

我找到了相关的this 问题。但它并没有解决我不知道我需要的组合的问题,所以我无法提前创建索引。

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

【问题讨论】:

    标签: javascript html indexeddb


    【解决方案1】:

    SELECT * FROM College WHERE session = ? AND 当然 = ?

    这并不意味着sessioncourse 上有索引。即使没有索引,它也会起作用。您可以在 IndexedDB 中执行相同的操作,只需在整个数据库中搜索与您的约束匹配的对象。

    我不能写出这 5 个字段的 2^5(或其他)可能的组合。

    实际上是"5 choose 2",有 10 种可能的组合。所以……真的没有那么多。您可以尝试添加所有可能的组合。

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

    【讨论】:

    • 这是一个正确的答案,但如果它以某种好的方式更清晰会更好。这可能是 Achshar 第一次接触这个概念。这个答案指出的是您也没有在 SQL 中使用索引。但我认为真正要问的是如何快速查询多个属性,无论有无索引。答案是你不需要索引,除非你想要更好的性能。只需遍历所有对象并过滤掉您不想要的对象。如果要使用索引,请了解 NOSQL 中的查询计划。 en.wikipedia.org/wiki/Query_plan
    • 所以......你基本上是在说手动工作?就像将所有数据加载到一个数组中并过滤我想要的一样。这不完全是我所期待的。但我想我可以应付。
    • @Josh 你确实是对的,这是我第一次使用 NoSQL 数据库。我会阅读更多。谢谢!
    • 是的,基本的简单方法是迭代。您可以对每个 onsuccess 回调进行迭代,因此您不需要预加载到数组中然后对其进行迭代,但是如果您避免使用数组技术,则需要在作为异步调用结果的回调中编写每次迭代代码,这对于刚刚学习这些东西的人来说也更复杂。是的,这是糟糕的表现。更好的方法,以及 indexedDB 的使用方式,是使用索引。但是现在您在特定情况下遇到了一个非常复杂的问题,即(复合)索引如何工作。
    • 请参阅stackoverflow.com/questions/23806635,了解为什么在特定情况下使用复合索引会遇到问题。
    猜你喜欢
    • 2021-01-20
    • 2019-01-02
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    相关资源
    最近更新 更多