You need to enable JavaScript to run this app. 如何在Dexie.js中实现嵌套数组的索引与查询操作
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 13:45:04