如何在Dexie.js中实现嵌套数组的索引与查询操作
你对MultiEntry索引的理解存在偏差,这类索引只会打平一层顶层数组,不会递归处理多层嵌套的数组结构,因此没法直接给你示例中的二维数组内层元素建立索引。
你当前的写法中,*properties 索引会把顶层properties数组的每一个子数组作为独立索引项存储,索引内的值为['language', 'english']、['subject', 'philosophy']这类数组本身,而非数组内的单个元素,因此无法直接通过索引查询子数组中的economics值。
要实现你的需求,有两种可行方案:
方案一:调整存储结构适配索引(性能最优,推荐)
将二维数组的键值对拼接为单字符串,直接存入顶层数组,即可复用MultiEntry索引实现高性能查询:
var db = new Dexie('dbname'); db.version(1).stores({ books: 'id, author, name, *properties' }); // 存储时将二维数组项改为冒号拼接的字符串 db.books.put({ id: 1, name: 'Human Action', author: 'Ludwig von Mises', properties: ['language:english', 'subject:philosophy', 'subject:economics'] });
查询语句直接走索引,性能不受数据量影响:
const result = await db.books.where('properties').equals('subject:economics').toArray();
方案二:不修改存储结构,全表过滤(仅适合小数据量)
如果不想调整现有存储格式,可以直接用filter方法自定义规则过滤,缺点是不走索引,数据量超过千级后查询延迟会明显升高:
const result = await db.books.filter(book => { return book.properties.some(prop => { return prop[0] === 'subject' && prop[1] === 'economics' }) }).toArray();
内容的提问来源于stack exchange,提问作者fiatjaf
相关产品推荐
相关产品推荐

