Частичный запрос с использованием составного ключа в IndexedDB

Учтите, у меня есть база данных IndexedDB с составным ключом, например: [prop1, prop2].

Можно ли выполнить частичный запрос, когда известно, что только одна часть ключа возвращает несколько записей из базы данных?

Это будет эквивалентно следующему SQL-запросу:

SELECT * FROM table WHERE prop1 = 'foo'

OR:

SELECT * FROM table WHERE prop2 = 'bar'

Я пытался использовать метод getAll(), но похоже, что он ожидает значение для обеих частей ключа.

Если это невозможно — какую альтернативу можно рассмотреть вместо этого?


person Slava Fomin II    schedule 26.05.2021    source источник


Ответы (2)


Я все еще не уверен, что частичный запрос действительно возможен для составного ключа, однако я решил переключиться на другую стратегию:

Идея состоит в том, чтобы использовать автоматически сгенерированный первичный ключ для хранилища, а затем создать два отдельных индекса для prop1 и prop2. Таким образом, вы можете запрашивать оба свойства по отдельности. Это очень хорошо подходит для моего варианта использования:

// Example uses "idb" package from npm

const store = database.createObjectStore('resources', {
  keyPath: 'id',
  autoIncrement: true,
});

store.createIndex('url', 'url');

store.createIndex('hash', 'hash');

Однако я думаю, что вы можете использовать два дополнительных индекса с составным первичным ключом, если вам нужны какие-то гарантии уникальности. Вероятно, это было бы менее эффективно, чем использование индекса первичного ключа напрямую.

person Slava Fomin II    schedule 26.05.2021
comment
Это, пожалуй, лучший подход. Вы не можете просто выполнить запрос по части составного ключа. Самое близкое, что вы можете получить, это итерация курсора и продвижение. Подобные примеры в stackoverflow.com/questions/16522115/ - person Joshua Bell; 27.05.2021

Да, вы можете выполнить частичный запрос, потому что вы можете сравнивать массивы разной длины. Но результаты будут не велики. В основном вы можете повторно использовать первый элемент составного массива в качестве собственного индекса. Но также результатов с неопределенным значением второго элемента может и не быть.

Вы можете сделать это тривиально для prop1, используя значение запроса, например [prop1value]. Однако вы не можете сделать это тривиально для prop2.

person Josh    schedule 27.05.2021