Фильтрация данных в Dexie.js строится вокруг индексированных запросов
и API where(), которое предоставляет набор операторов
сравнения для работы с IndexedDB. Эти операторы позволяют выполнять
выборки по точному совпадению, диапазонам и префиксному поиску, опираясь
на индексы, определённые в схеме базы данных.
Метод where() работает только с индексированными полями.
Индекс создаётся при объявлении схемы базы данных:
const db = new Dexie("AppDB");
db.version(1).stores({
users: "++id, name, age, city"
});
В этом примере name, age и
city являются индексируемыми полями, и к ним применимы
операторы сравнения.
Запрос начинается с выбора индекса:
db.users.where("age")
Далее применяется оператор сравнения.
Оператор equals() (или сокращённая форма
.equals(value)) используется для поиска записей, где
значение индекса строго совпадает с заданным.
db.users.where("city").equals("Almaty").toArray();
Особенности:
Для чисел:
db.users.where("age").equals(25).toArray();
Оператор above() возвращает записи, где значение индекса
строго больше указанного.
db.users.where("age").above(30).toArray();
Логика:
value > xПример с датами:
db.orders.where("createdAt").above(new Date("2025-01-01")).toArray();
Строковое сравнение выполняется лексикографически:
db.users.where("name").above("M").toArray();
Оператор below() является противоположностью
above() и выбирает записи, где значение индекса меньше
указанного.
db.users.where("age").below(18).toArray();
Поведение:
value < xПример с датами:
db.orders.where("createdAt").below(new Date("2024-01-01")).toArray();
Лексикографическое сравнение строк:
db.users.where("name").below("K").toArray();
Оператор between() позволяет задавать диапазон значений
для индекса.
db.users.where("age").between(18, 30).toArray();
По умолчанию границы включаются:
Расширенная форма:
db.users.where("age").between(18, 30, true, true).toArray();
Параметры:
between(lower, upper, includeLower, includeUpper)
Варианты поведения:
true, true — включены обе границыfalse, false — обе границы исключеныtrue, false — включена нижняя, исключена верхняяfalse, true — исключена нижняя, включена верхняяПример исключающего диапазона:
db.users.where("age").between(18, 30, false, false).toArray();
Диапазоны особенно эффективны при работе с числовыми и датированными индексами, так как IndexedDB использует B-tree структуру.
Оператор startsWith() применяется к строковым индексам и
выполняет поиск по началу строки.
db.users.where("name").startsWith("Al").toArray();
Он возвращает все записи, где значение поля начинается с указанного префикса:
Особенности:
filter(), так как использует индексПример для городов:
db.users.where("city").startsWith("New").toArray();
Операторы можно разделить по типу сравнения:
Точное совпадение:
equals(value)
Диапазонные:
above(value)
below(value)
between(lower, upper)
Строковый префикс:
startsWith(prefix)
Все операторы where() опираются на IndexedDB индексы.
Это означает:
filter(), который
значительно медленнееПример ошибки архитектуры:
db.users.where("nonIndexedField").equals("test")
Такой запрос невозможен без индекса.
Для above, below, between и
startsWith строки сравниваются не по смыслу, а по
Unicode-порядку.
Пример:
"A" < "B"
"Z" < "a"
Это влияет на:
Различие включённых и исключённых границ критично при построении диапазонов:
db.users.where("age").between(18, 18).toArray();
Вернёт только записи с age = 18, если границы включены.
При исключении:
db.users.where("age").between(18, 18, false, false).toArray();
результат всегда пуст.
Операторы сравнения часто используются в цепочках:
db.users
.where("age")
.between(18, 30)
.and(user => user.city === "Almaty")
.toArray();
Или с сортировкой:
db.users
.where("age")
.above(20)
.sortBy("name");
wherestartsWith применим только к строкамДиапазонные операторы (above, below,
between, startsWith) используют B-tree
индексирование, что обеспечивает:
Особенно эффективны:
startsWithВсе операторы возвращают пустой массив без ошибок, если совпадений нет:
db.users.where("age").above(200).toArray(); // []
Поведение операторов зависит от типа индекса:
Несоответствие типов может привести к неожиданным результатам фильтрации.