Запрос с использованием нескольких условий - PullRequest
30 голосов
/ 20 июня 2011

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

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

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

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

Спасибо!

Ответы [ 5 ]

29 голосов
/ 24 марта 2013

Проверьте этот ответ на тот же вопрос. Это более подробно, чем ответ, который я даю здесь. Параметр 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]));
3 голосов
/ 05 сентября 2017

Допустим, ваш 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

1 голос
/ 09 июля 2016

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

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

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

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

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

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

1 голос
/ 03 сентября 2012

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

Если вы найдете решение, пожалуйста, дайте мне знать.

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

0 голосов
/ 15 января 2012

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

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

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

...