0Pricing
JavaScript Academy · 课时

索引与查询

使用索引高效查询数据。

索引与查询 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 4 节课。

为什么需要索引

默认情况下,您只能通过主键查找记录。索引可以让您高效地根据其他属性进行查询,例如查找所有姓氏相同的用户。

创建索引

在 onupgradeneeded 中创建索引,也就是创建对象存储后立即使用 store.createIndex(name, keyPath, options) 创建。

request.onupgradeneeded = (e) => {
  const db = e.target.result;
  const store = db.createObjectStore('users', { keyPath: 'id' });
  store.createIndex('byEmail', 'email', { unique: true });
};

唯一索引与非唯一索引

unique 选项可确保没有两条记录共享同一个索引值。当多条记录可以共享同一个值(例如城市)时,请使用 unique: false(默认值)。

store.createIndex('byCity', 'city', { unique: false });
store.createIndex('byEmail', 'email', { unique: true });

通过索引进行查询

在事务中从对象存储获取索引,然后使用索引属性的值调用其上的 get 或 getAll。

const tx = db.transaction('users', 'readonly');
const index = tx.objectStore('users').index('byEmail');
const req = index.get('ada@example.com');
req.onsuccess = () => console.log(req.result);

getAll

getAll() 会在一次请求中将所有匹配的记录作为数组返回。对于中等规模的结果集,这比使用游标逐条遍历更简单。

const index = store.index('byCity');
const req = index.getAll('Paris');
req.onsuccess = () => {
  console.log('found', req.result.length, 'users in Paris');
};

键范围

IDBKeyRange 用于描述范围查询中的键区间。可用的辅助方法包括 only、lowerBound、upperBound 和 bound。

const range = IDBKeyRange.bound(18, 65); // ages 18..65
const index = store.index('byAge');
index.getAll(range);

边界选项

IDBKeyRange.bound(lower, upper, lowerOpen, upperOpen) 可以排除端点。开放边界不包含端点。

// 18 inclusive, 65 exclusive:
const range = IDBKeyRange.bound(18, 65, false, true);
// lowerBound(10) => keys >= 10
// upperBound(10, true) => keys < 10

游标

对于大型结果集或自定义遍历,可以使用 index.openCursor(range) 打开游标。它会逐条访问匹配的记录,因此不必将所有数据加载到内存中。

const req = store.index('byCity').openCursor();
req.onsuccess = (e) => {
  const cursor = e.target.result;
  if (cursor) {
    console.log(cursor.value);
    cursor.continue(); // move to next match
  }
};

统计匹配数量

index.count(range) 会在不获取记录的情况下返回匹配的记录数,因此速度快且占用内存少。

const req = store.index('byCity').count('Paris');
req.onsuccess = () => console.log('count:', req.result);

仅获取键

getAllKeys 和键游标只会返回匹配记录的主键。当您只需要引用而不需要完整对象时,它们非常有用。

const req = store.index('byCity').getAllKeys('Paris');
req.onsuccess = () => console.log('keys:', req.result);

查询回顾

索引让 IndexedDB 成为可查询的存储:在 onupgradeneeded 中创建索引,然后使用 get、getAll、键范围和游标来获取确切需要的记录。

快速检查

测试您对索引和查询的理解。

回顾

您学习了索引和查询:

  • 使用 createIndex 在 onupgradeneeded 中创建索引。
  • unique 选项可确保值各不相同。
  • 通过 index.get / getAll 进行查询。
  • IDBKeyRange 支持范围查询。
  • 游标用于遍历大型集合;count 用于统计匹配项。

接下来学习版本管理和升级。

常见问题解答

「索引与查询」课时是免费的吗?

是的 — 「索引与查询」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 4 节课。

「索引与查询」这节课中我会学到什么?

使用索引高效查询数据。 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 JavaScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「索引与查询」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 JavaScript Academy 课中编写并运行代码吗?

能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 打开数据库
  2. 事务与 CRUD
  3. 索引与查询
  4. 版本管理与升级
← 返回 JavaScript Academy