Метод toArray() в Dexie.js служит для преобразования
результата запроса IndexedDB в обычный массив JavaScript. Он является
завершающей операцией (terminal operation), которая материализует
ленивый результат запроса и выполняет фактическое чтение данных из
базы.
В Dexie.js toArray() доступен не только у коллекций, но
и у таблиц и некоторых запросов через where().
При вызове toArray():
Promise, который резолвится этим
массивом.Особенность заключается в том, что до вызова toArray()
большинство операций в Dexie остаются ленивыми, особенно при
использовании цепочек фильтрации и сортировки.
collection.toArray(): Promise<Array<T>>
const users = await db.users.toArray();
В этом случае:
users;const adults = await db.users
.where("age")
.aboveOrEqual(18)
.toArray();
Здесь происходит:
age;const result = await db.users
.orderBy("age")
.filter(user => user.active)
.toArray();
В этом случае:
toArray() следует рассматривать как операцию,
которая:
Ключевые моменты:
limit() до toArray()
уменьшает объём выборки.const latest = await db.logs
.orderBy("timestamp")
.reverse()
.limit(100)
.toArray();
Метод toCollection() преобразует результат запроса
Table или WhereClause в объект
Collection, позволяя продолжить построение цепочки операций
над набором данных.
В отличие от toArray(), он не завершает выполнение
запроса, а наоборот — переводит его в расширяемую форму.
toCollection() используется для:
table.toCollection(): Collection<T, IndexType>
const collection = db.users.toCollection();
Результат:
const collection = db.users
.where("age")
.above(18)
.toCollection();
Здесь:
const result = await db.users
.where("age")
.above(18)
.toCollection()
.filter(user => user.active)
.sortBy("name");
Логика выполнения:
sortBy()).toArray() — завершает запрос и возвращает данные;toCollection() — преобразует запрос в промежуточную
форму для дальнейших операций.db.users.where("age").above(18).toArray();
db.users.where("age").above(18).toCollection();
Dexie.js строит выполнение запросов по принципу:
toArray() запускает финальную материализацию.db.users
.where("age")
.above(18)
.filter(u => u.active)
.toArray();
Порядок:
age > 18;active;Чем позже вызывается toArray(), тем больше операций
попадает в JS-слой.
const list = await db.users
.toCollection()
.sortBy("createdAt");
const last10 = await db.users
.orderBy("createdAt")
.reverse()
.limit(10)
.toArray();
Разница:
limit() влияет на объем данных до материализации;toArray() фиксирует результат.const items = await db.products
.where("category")
.equals("books")
.toArray();
const activeUsers = await db.users
.toCollection()
.filter(u => u.active)
.sortBy("name");
const result = await db.orders
.where("status")
.anyOf(["new", "processing"])
.toCollection()
.filter(o => o.total > 100)
.toArray();
Оба метода работают поверх IndexedDB, который является асинхронным хранилищем. Это означает:
toArray() на больших наборах приводит к
росту потребления памяти;toCollection() при неправильной фильтрации может
переносить слишком много операций в JavaScript;limit() в цепочке увеличивает нагрузку.Запросы IndexedDB в Dexie работают в рамках транзакционной модели:
toArray() возвращает консистентный снимок данных.После toCollection() доступны методы:
filter()map()each()sortBy()count()Пример цепочки:
const names = await db.users
.toCollection()
.filter(u => u.age > 18)
.map(u => u.name)
.sortBy(name => name);
toArray() фиксирует результат и завершает
вычисление;toCollection() сохраняет ленивую модель и расширяет
возможности обработки.Разница между ними формирует основу управления запросами Dexie.js: либо ранняя материализация, либо построение цепочки трансформаций перед финальным извлечением данных.