IndexedDB - IDBKeyRange для простого индекса со списком произвольных ключей - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть хранилище объектов в IDB с простым (не составным) индексом для поля X. Этот индекс не является уникальным (многие элементы могут иметь одинаковое значение для X).

IВы хотите запросить в IDB все элементы со значением X, равным "foo", "bar" или "bat".

Согласно документации, индекс getAll принимает либо ключ(в моем случае строка) или IDBKeyRange.Однако для меня не очевидно, как создать IDBKeyRange с произвольным набором ключей и получить объединение всех результатов на основе этих ключей.

1 Ответ

0 голосов
/ 19 сентября 2018

Вы не можете сделать это в одном запросе.indexedDB в настоящее время не поддерживает запросы в стиле «ИЛИ».

Альтернативное решение - выполнить один запрос на значение.По сути, для каждого значения используйте getAll в индексе для этого значения, затем объедините все массивы в один массив (возможно, объедините дубликаты).На самом деле у вас не так много обходов с БД, так как вы используете getAll.При настройке этого индекса вы в основном хотите хранить, скажем, «вещи», где каждая «вещь» имеет свойство, такое как «теги», где теги - это массив значений (каждый из которых представляет собой строку).Индекс, который вы создаете для свойства "tags", должен быть помечен как индекс с несколькими записями.

Конечно, существуют творческие хакерские решения.Вот один.Имейте в виду, что это совершенно бесполезно, если у вас есть вещи, которые имеют разные наборы тегов, но вы все равно хотите соответствовать тем, которые разделяют, это будет работать, только если вам не важно, есть ли у какой-либо вещи дополнительные теги.Например, рассмотрим каждый отдельный набор значений, игнорируя порядок.Давайте назовем их группами.Например, foo равно 1, bar - 2, bat - 3, foo-bar - 4, foo-bat - 5, bar-bat - 6 и т. Д. Каждой группе можно дать ключ, например, значение числового счетчика, которое я только что использовал впример.Затем вы можете сохранить групповой ключ как свойство объекта.Каждый раз, когда вы собираетесь сохранить объект, рассчитайте его групповой ключ.Вы можете предварительно рассчитать все групповые ключи или разработать функцию в стиле хеш-функции, которая генерирует конкретный ключ с учетом набора произвольных строковых значений.Конечно, вы платите чуть больше авансом во время хранения и при создании запроса, но вы экономите тонну обработки, потому что indexedDB выполняет всю обработку после этого.Итак, вы хотите простой быстрый хеш.И конечно, это добавляет сложности.Но, возможно, это сработает.Просто найдите простой JS-хэш.Измените его, чтобы лексикографически сохранять значение, установленное перед использованием (чтобы разница в порядке значений не приводила к разнице в значении хеша).Итак, чтобы объяснить более конкретно, для хранилища объектов вещей, у каждого объекта вещей есть свойство, называемое «тег-хэш».Для этого вы создаете базовый индекс (не уникальный, не многократный).Каждый раз, когда вы помещаете вещь в магазин, вы вычисляете значение тега-хэша и устанавливаете значение свойства перед вызовом пут.Затем каждый раз, когда вы хотите выполнить запрос, вы вычисляете хеш массива тегов, по которому вы хотите выполнить запрос, затем вызываете getAll(calculated-hash-value), и он выдаст вам все, что имеет эти точные теги.

...