Как я могу выполнить запрос с использованием нескольких условий в IndexedDB?

Недавно я обнаружил (к сожалению), что WebSQL больше не поддерживается для HTML5, и вместо этого IndexedDB будет заменять его.

Мне интересно, есть ли способ запросить или выполнить поиск по элементам IndexedDB аналогично тому, как я могу использовать SQL для поиска записи, удовлетворяющей нескольким условиям.

Я видел, что я могу искать через IndexedDB, используя одно условие с KeyRange. Тем не менее, я не могу найти способ поиска двух или более столбцов данных без захвата всех данных из базы данных и выполнения их с помощью циклов.

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

Спасибо!

Ответ 1

Отправьте этот ответ на тот же вопрос. Это более подробно, чем тот, который я даю здесь. Параметр keypath для методов store.createIndex и IDBKeyRange может быть массивом. Итак, грубый пример:

// In onupgradeneeded
var store = db.createObjectStore('mystore');
store.createIndex('myindex', ['prop1','prop2'], {unique:false});

// In your query section
var transaction = db.transaction('mystore','readonly');
var store = transaction.objectStore('mystore');
var index = store.index('myindex');
// Select only those records where prop1=value1 and prop2=value2
var request = index.openCursor(IDBKeyRange.only([value1, value2]));
// Select the first matching record
var request = index.get(IDBKeyRange.only([value1, value2]));

Ответ 2

Да, открытие непрерывного диапазона клавиш по индексу в значительной степени соответствует индексированномуDB. Тестирование для нескольких условий невозможно в IndexedDB. Это необходимо сделать в цикле курсора.

Если вы найдете решение, сообщите мне.

Кстати, я думаю, что курсор может быть очень быстрым и требует меньше памяти, чем возможно с Sqlite.

Ответ 3

Я пару лет опаздываю, но я просто хотел бы отметить, что ответ Джоша работает над предположением, что все "столбцы" в состоянии являются частью индекса keyPath.

Если какой-либо из указанных "столбцов" существует вне индекса keyPath, вам нужно будет проверить условия, связанные с ними, на каждой записи, которую создает курсор, созданный в примере. Поэтому, если вы имеете дело с такими запросами или ваш индекс не unique, будьте готовы написать некоторый код итерации!

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

Для этих типов операций он всегда будет открывать курсор на объекте focusStore, если вы выполняете строгий запрос равенства (x ===? y, если x является объектным или индексным ключом), но это избавит вас от проблем написание собственного кода итерации курсора:

bakedGoods.getAll({
    filter: "keyObj > 5 && valueObj.someProperty !== 'someValue'",
    storageTypes: ["indexedDB"],
    complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){}
});

Только для полной прозрачности BakedGoods поддерживается moi.

Ответ 4

Скажем, ваш SQL-запрос выглядит примерно так:

SELECT * FROM TableName WHERE Column1 = 'value1' AND Column2 = 'value2'

Эквивалентный запрос в JsStore библиотека:

var Connection = new JsStore.Instance("YourDbName");
Connection.select({
    From: "YourTableName"
    Where: {
        Column1: 'value1',
        Column2: 'value2'
    },
    OnSuccess:function (results){
        console.log(results);
    },
    OnError:function (error) {
        console.log(error);
    }
});

Теперь, если вам интересно, что такое JsStore, позвольте мне сказать вам, что это библиотека, которая упрощает запрос IndexedDB. Нажмите здесь, чтобы узнать больше о JsStore

Ответ 5

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

Концептуальные проблемы с IndexedDB (отношения и т.д.)

Что касается запроса сразу нескольких полей, это не похоже на то, что в IndexedDB есть собственный способ сделать это (я мог ошибаться, я все еще новичок в этом), но вы, безусловно, могли бы создать вспомогательную функцию, которая использовал отдельный курсор для каждого поля и повторил их, чтобы увидеть, какие записи соответствуют всем критериям.