IndexedDB - логический индекс

Можно ли создать индекс в поле типа Boolean?

Предположим, что схема записей, которые я хочу сохранить:

{
  id:1,
  name:"Kris",
  _dirty:true
}

Я создал обычный не уникальный индекс (onupgradeneeded):

...
store.createIndex("dirty","_dirty",{ unique: false })
...

Индекс создается, но он пуст! - В индексе браузера IndexedDB нет записей с Boolean значениями - только Строки, Числа и Даты или даже Массивы.

Я использую Chrome 25 canary

Мне бы хотелось найти все записи, для которых атрибут _dirty установлен равным true - мне нужно изменить _dirty на string или int then?

Ответ 1

Да, boolean не является допустимым ключом.

Если вам нужно, конечно, вы можете решить 1 и 0.

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

Ответ 2

Ответ, отмеченный как отмеченный, не совсем корректен.

Вы не можете создать индекс для свойства, содержащего значения типа Boolean JavaScript. Эта часть другого ответа верна. Если у вас есть такой объект, как var obj = {isActive: true};, попытка создания индекса на obj.isActive не будет работать, и браузер сообщит об ошибке.

Однако вы можете легко имитировать желаемый результат. indexedDB не вставляет свойства, которые отсутствуют в объекте в индекс. Поэтому вы можете определить свойство для представления true, а не определять свойство для представления false. Когда свойство существует, объект появится в индексе. Когда свойство не существует, объект не будет отображаться в индексе.

Пример

Например, предположим, что у вас есть хранилище объектов объектов obj. Предположим, вы хотите создать булевообразный индекс в свойстве isActive для этих объектов.

Начните с создания индекса в свойстве isActive. В функции обратного вызова onupgradeded используйте store.createIndex('isActive','isActive');

Чтобы представить 'true' для объекта, просто используйте obj.isActive = 1;. Затем добавьте или поместите объект в хранилище объектов. Если вы хотите запросить все объекты, где установлен isActive, вы просто используете db.transaction('store').index('isActive').openCursor();.

Чтобы представить false, просто используйте delete obj.isActive;, а затем добавьте или или поместите объект в хранилище объектов.

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

Voila, булев индекс.

Замечания по производительности

Открытие курсора на индекс, как это было сделано в примере, используемом здесь, обеспечит хорошую производительность. Разница в производительности не заметна с небольшими данными, но она чрезвычайно заметна при хранении большего количества объектов. Нет необходимости принимать некоторую библиотеку третьей стороны для выполнения "логических индексов". Это обычная и простая функция, которую вы можете сделать самостоятельно. Вы должны попробовать как можно больше использовать встроенную функциональность.

Ответ 3

Логические свойства описывают исключительное состояние (активное/неактивное), "Вкл./Выкл.", "Включено/Отключено", "Да/Нет". Вы можете использовать эти пары значений вместо Boolean в модели данных JS для удобства чтения. Также эта тактика позволяет добавлять другие состояния ( "NotSet", для ситуации, если что-то не было настроено в объекте и т.д.)...