В indexedDB возможно ли сделать эффективный эквивалент вызова "где столбец в (значение1, значение2.... значение2)"?

Я хочу реализовать этот поиск с использованием indexedDB:

where CustomerName in ('bob', 'fred'... 'nancy')

Я вижу две возможности:

1) просто openCursor в хранилище объектов, затем цикл по всей таблице, проверяя вручную, есть ли запись ('bob', 'fred'... 'nancy')

2) используя index, выполните несколько вызовов индекса openCursor('bob'), openCursor('fred')...

оба openCursor принимают IDBKeyRange, который, кажется, не позволяет искать несколько значений, не продолжающихся

Есть ли другой, более эффективный способ?

2 ответа

Любое из ваших предложений работает.

Улучшение производительности до #1 будет состоять в том, чтобы сначала отсортировать список ключей (например, используя indexedDB.cmp() реализовать функцию сравнения) и открыть курсор на первой клавише (например, "bob"). Затем, когда вы выполняете итерацию, после того, как вы видите ключ, следующий за "bob", но перед "fred", вы continue('fred') пропустить промежуточные записи. Это позволяет избежать перебора записей в таблице, которая вас не волнует.

Последние версии Chrome/Firefox/Safari также поддерживают getAll(), который будет вариантом для вашего #2, чтобы получить все записи для данного ключа сразу (например, через getAll('nancy')) вместо того, чтобы перебирать курсор.

Вероятно, самый быстрый способ - это отсортировать искомые ключи, открыть курсор на первом, IDBCursor.continue пока у вас нет всех значений для этого ключа, а затем IDBCursor.advance к следующему ключу, который вы ищете. Повторите, пока вы не сделали все ключи. Таким образом, вы получаете все значения одним курсором, но можете быстро пропустить значения, которые вам не нужны.

Другие вопросы по тегам