Indexeddb: поиск с использованием подстановочных знаков - PullRequest
6 голосов
/ 20 марта 2012

Мне было интересно, можно ли выполнить поиск в хранилище объектов indexeddb с использованием подстановочных знаков.Было бы удобно найти все объекты с ключом, начинающимся с '555', например

Ответы [ 4 ]

5 голосов
/ 21 марта 2012

Это возможно из коробки, используя либо составные ключи, либо фрагменты ключей. Клавиши работают в IndexedDB так, что вы генерируете объект "keyRange" и передаете его вызову курсора. Брелок передает информацию, такую ​​как «начинаются в A и заканчиваются в Z включительно».

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

Скажем, у вас есть эти слова в качестве ключей в хранилище объектов:

  • Aardvark
  • Apple
  • Google
  • Microsoft

Ключевой диапазон «от A до Z включительно» вернул бы все это, но «от Ap до Z включительно» вернул бы только последние три.

Другой метод, который я использовал для реализации этого, - это передача функции «filter» моим методам, которые вызывают IndexedDB. Внутри методов обратного вызова onsuccess, передайте результат (event.target.result) через функцию фильтра и, если он вернет true, вызовите обратный вызов onsuccess вызывающего метода.

4 голосов
/ 04 января 2014

Да, возможно использовать подстановочные знаки, вроде.

Я пока не могу голосовать или даже комментировать предыдущие ответы (хммм ...), поэтому я просто повторю ответ user2025527, поскольку он полностью работал

Используйте метод bounds и укажите базовое значение для 1-го аргумента и то же значение плюс дополнительный символ для 2-го аргумента.

В большинстве случаев дополнительный символ долженбыть последним в вашей кодировке: \ uffff

Но вы можете сами решать, что составляет ограничение, особенно при работе с локализацией.

Чтобы не указывать следующие значения в вашем индексе:

  • A
  • AB
  • B
  • BA
  • BB
  • C

Чтобы найти все, что указано в «BA», вы должны использовать

var range = IDBKeyRange.bound("BA", "BA" + '\uffff');
2 голосов
/ 13 августа 2012

По умолчанию это невозможно, но моя библиотека, которую я написал для indexeddb, поддерживает это.Попробуйте linq2indexeddb .

1 голос
/ 18 апреля 2013

Поиск также возможен с использованием подстановочных знаков в indexeddb, см. Ссылку IndexedDB Нечеткий поиск

для подстановочного знака ниже должно работать: var range = IDBKeyRange.bound ("555", "555" + '\ uffff');

Или же вы можете использовать библиотеку Linq2indexeddb, чтобы использовать подобные.

...