IndexedDB - IDBKeyRange on simple index with arbitrary key list

时间:2018-09-18 19:29:57

标签: html5 indexeddb

I have an object store in an IDB that has a simple (non-compound) index on a field X. This index is not unique (many items may have the same value for X).

I'd like to query the IDB to return all items that have an X value of either "foo", "bar", or "bat".

According to the documentation, index getAll takes either a key (in my case a string) or an IDBKeyRange. However, it's not obvious to me how to construct an IDBKeyRange with an arbitrary set of keys, and get the union of all results based on those keys.

1 个答案:

答案 0 :(得分:0)

您不能在单个请求中执行此操作。 indexedDB当前不支持“ OR”样式查询。

另一种解决方案是对每个值执行一个请求。基本上,对于每个值,在索引上使用getAll作为值,然后将所有数组连接到单个数组中(可能合并重复项)。实际上,由于您使用的是getAll,因此与数据库之间实际上没有太多往返。在设置该索引时,您基本上希望存储一个“事物”,其中每个“事物”都有一个属性,例如“标签”,其中标签是值的数组(每个都是字符串)。您在“标签”属性上创建的索引应标记为多条目索引。

当然,有一些创造性的解决方案。这是一个。请记住,如果您拥有的东西具有不同的标签集,但是您仍想匹配共享的标签集,那将是完全没有用的,只有当您不关心任何东西是否具有额外的标签时,这才起作用。例如,考虑每个不同的值集,而忽略顺序。我们称它们为组。例如。 foo是1,bar是2,bat是3,foo-bar是4,foo-bat是5,bar-bat是6,依此类推。您可以给每个组一个键,就像我刚刚在其中使用的数字计数器值例。然后,您可以将组密钥作为属性存储在对象中。每次您存储对象时,都要计算其组密钥。您可以预先计算所有组键,也可以开发一个哈希样式的函数,该函数在给定一组任意字符串值的情况下生成特定的键。当然,在存储时以及在构建请求查询时,您要多付一些前期费用,但是您可以节省大量的处理过程,因为indexedDB在此之后进行了所有处理。因此,您需要一个简单的快速哈希。当然,这增加了复杂性。但是也许会起作用。只需找到一个简单的JS哈希即可。对其进行修改,以便您在使用前按字典顺序存储值集(这样,值顺序的差异不会导致哈希值的差异)。因此,更具体地说,对于物联网对象存储,每个物联网对象都有一个称为“标签哈希”的属性。您为此创建一个基本索引(不是唯一的,不是多次输入的)。每次将东西放入商店时,您都需要在调用put之前计算tags-hash的值,并设置属性的值。然后,每次您要查询时,都要计算要查询的标签数组的哈希,然后调用getAll(calculated-hash-value),它将为您提供所有具有这些确切标签的东西。