在 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()
方法,但看起来它对密钥的两个部分都期望值。
如果不可能——可以考虑什么替代方案?
我仍然不确定复合键是否真的可以进行部分查询,但是,我决定切换到不同的策略:
想法是使用自动生成的存储主键,然后为 prop1
和 prop2
创建两个单独的索引。这样,您可以分别查询这两个属性。这非常适合我的用例:
// 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
.
简单地执行此操作
考虑一下,我有一个带有复合键的 IndexedDB 数据库,例如:[prop1, prop2]
.
是否可以进行部分查询,其中数据库中的 return 多条记录只知道密钥的一部分?
这将等同于以下 SQL 查询:
SELECT * FROM table WHERE prop1 = 'foo'
或:
SELECT * FROM table WHERE prop2 = 'bar'
我试过使用 getAll()
方法,但看起来它对密钥的两个部分都期望值。
如果不可能——可以考虑什么替代方案?
我仍然不确定复合键是否真的可以进行部分查询,但是,我决定切换到不同的策略:
想法是使用自动生成的存储主键,然后为 prop1
和 prop2
创建两个单独的索引。这样,您可以分别查询这两个属性。这非常适合我的用例:
// 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
.