0Pricing
JavaScript Academy · Урок

Индексы и запросы

Эффективно запрашивайте данные с помощью индексов.

«Индексы и запросы» — бесплатный урок JavaScript Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения 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, диапазоны ключей и курсоры, чтобы получать именно нужные записи.

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете индексы и запросы.

Итоги

Вы изучили индексы и запросы:

  • Создавайте индексы в onupgradeneeded с помощью createIndex.
  • Параметр unique гарантирует уникальность значений.
  • Выполняйте запросы через index.get / getAll.
  • IDBKeyRange поддерживает запросы по диапазону.
  • Курсоры перебирают большие наборы, а count подсчитывает совпадения.

Далее — версии и обновления.

Часто задаваемые вопросы

Урок «Индексы и запросы» бесплатный?

Да — полный текст урока «Индексы и запросы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс JavaScript Academy, подпишись на CoddyKit PRO. Курс JavaScript Academy содержит 4 уроков всего.

Чему я научусь в уроке «Индексы и запросы»?

Эффективно запрашивайте данные с помощью индексов. Ты практикуешь JavaScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать JavaScript Academy?

Предыдущий опыт не требуется. JavaScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Индексы и запросы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке JavaScript Academy?

Да. Каждый урок JavaScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Открытие базы данных
  2. Транзакции и CRUD
  3. Индексы и запросы
  4. Версионирование и обновления
← Назад к JavaScript Academy