在 IndexedDB 中使用复合键进行部分查询

Partial query using composite key in IndexedDB

考虑一下,我有一个带有复合键的 IndexedDB 数据库,例如:[prop1, prop2].

是否可以进行部分查询,其中数据库中的 return 多条记录只知道密钥的一部分?

这将等同于以下 SQL 查询:

SELECT * FROM table WHERE prop1 = 'foo'

或:

SELECT * FROM table WHERE prop2 = 'bar'

我试过使用 getAll() 方法,但看起来它对密钥的两个部分都期望值。

如果不可能——可以考虑什么替代方案?

我仍然不确定复合键是否真的可以进行部分查询,但是,我决定切换到不同的策略:

想法是使用自动生成的存储主键,然后为 prop1prop2 创建两个单独的索引。这样,您可以分别查询这两个属性。这非常适合我的用例:

// Example uses "idb" package from npm

const store = database.createObjectStore('resources', {
  keyPath: 'id',
  autoIncrement: true,
});

store.createIndex('url', 'url');

store.createIndex('hash', 'hash');

但是,如果您需要一些唯一性保证,我认为您也可以将两个附加索引与复合主键一起使用。可能这会比直接使用主键的索引更不有效。

是的,您可以进行部分查询,因为您可以比较不同长度的数组。但结果不会很好。您基本上可以将复合数组的第一个元素重新用作其自己的索引。但是,第二个元素上未定义的结果也可能不存在。

您可以通过使用像 [prop1value] 这样的查询值为 prop1 简单地执行此操作。但是,您不能为 prop2.

简单地执行此操作