Почему я не могу получить правильный результат с помощью функции IDBKeyRange.bound в IndexedDB?

У меня есть макет indexedDB, который содержит такие элементы, как:

{
 id:1002, 
 name:"Frank", 
 company: "dg",
 age:30 
}

И я создал индекс ['name','age','company'] , просто хочу получить нужный мне результат, как это делает websql.

getMultipleDataByRange функция определена для получения элементов, я установил ['0',24,'ef'] как lowerBound и ['z',24,'ef'] как upperBound, я думал, что она должна показать мне результат, соответствующий элементам, которые 24 года плюс чья компания "ef". Но результат показывает, что все элементы соответствуют заданному диапазону. Как я могу установить диапазон, чтобы получить правильный результат.

Код также можно проверить по ссылке JSBIN, которую я сгенерировал:

http://jsbin.com/sinuxa/edit?js,console


person Jin    schedule 18.05.2016    source источник


Ответы (1)


Это сработает, если вы измените порядок своего индекса так, чтобы изменяющаяся часть (имя) находилась в конце. Если вы хотите узнать почему, см. Есть ли в IndexedDB способ сделать отсортированный составной запрос? для объяснения того, как работают составные индексы в IndexedDB.

person dumbmatter    schedule 18.05.2016
comment
Спасибо, я видел вопросы и ответы, о которых вы упоминали ранее. Мне просто интересно, есть ли способ получить окончательный результат без изменения порядка моего индекса, чтобы избежать создания более разных упорядоченных индексов для соответствия другим условиям. - person Jin; 19.05.2016
comment
Более того, я также проверяю N-мерный путь по этой ссылке (gist.github.com/inexorabletash/704e9688f99ac12dd336), но я думаю, что это не сработает, если смешаны строки, потому что трудно установить диапазон строк. Кроме того, я проверил некоторые уродливые способы, такие как сохранение результата для каждого условия в разных массивах, а затем получение пересечения. Это не элегантно и неэффективно, когда БД становится больше. - person Jin; 19.05.2016
comment
Этот смысл (я автор) должен работать для вашего случая. Согласен, что установка диапазонов строк является тонкой. Для любой строки вы можете использовать '' до [] (пустая строка идет первой, массив выше любой строки. Для строковых префиксов вы можете использовать, например, от 'a' до 'a￿' для любой строки, начинающейся с (если только ￿ действителен, то вам нужно использовать прием-преемник из gist.github.com/inexorabletash/5462871) - person Joshua Bell; 19.05.2016
comment
Будет ли образец gist проще с API, где вы передаете массив диапазонов ключей (или null), например. в вашем случае: [null, IDBKeyRange.only(24), IDBKeyRange.only('ef')]? - person Joshua Bell; 19.05.2016
comment
Было бы немного легче, по крайней мере, я хотел бы это увидеть. - person Josh; 25.05.2016