Индексы и запросы
Эффективно запрашивайте данные с помощью индексов.
«Индексы и запросы» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Открытие базы данных
- Транзакции и CRUD
- Индексы и запросы
- Версионирование и обновления