Индексированные базы данных - индекса логическое
Можно ли создать индекс на поле типаBoolean ?
Предположим, что схема записей, которые я хочу сохранить, такова:
{
id:1,
name:"Kris",
_dirty:true
}
Я создал нормальный не уникальный индекс (onupgradeneeded):
...
store.createIndex("dirty","_dirty",{ unique: false })
...
Индекс создан, но он пуст! - В браузере Index IndexedDB нет записей с булевыми значениями-только строки, числа идаты или даже массивы.
Я использую Chrome 25 канарейка
Я хотел бы найти все записи, у которых атрибут _dirty имеет значение true - нужно ли мне изменить _dirty на string или int?
3 ответа:
Да, boolean не является допустимым ключом .
Если вы должны, конечно, вы можете решить до 1 и 0.
Но на то есть веские причины. Индексирование логического значения не является информативным. В приведенном выше случае вы можете выполнять сканирование таблиц и фильтрацию на лету, а не индексировать запрос.
Ответ, помеченный как проверенный, не совсем корректен.
Невозможно создать индекс для свойства, содержащего значения типа Boolean JavaScript. Эта часть другого ответа верна. Если у вас есть объект типа
Однако вы можете легко смоделировать желаемый результат. indexedDB не вставляет в индекс свойства, отсутствующие в объекте. Таким образом, можно определить свойство для представления true, а не свойство для представления false. Если свойство существует, объект появится в индексе. Если свойство не существует, объект не будет отображаться в индексе.var obj = {isActive: true};
, попытка создать индекс наobj.isActive
не будет работать, и браузер сообщит об ошибке.Пример
Например, предположим, что у вас есть хранилище объектов 'obj'. Предположим, вы хотите создать булевидный индекс для свойства
isActive
этих объектов.Начните с создания индекса для свойства isActive. В функция обратного вызова onupgradeneeded, use
store.createIndex('isActive','isActive');
Чтобы представить 'true' для объекта, просто используйте
obj.isActive = 1;
. Затем добавьте или поместите объект в хранилище объектов. Если вы хотите запросить все объекты, для которых заданisActive
, вы просто используетеdb.transaction('store').index('isActive').openCursor();
.Чтобы представить false, просто используйте
delete obj.isActive;
, а затем добавьте или поместите объект в хранилище объектов.При запросе всех объектов, для которых задано значение
isActive
, эти объекты, у которых отсутствует свойствоisActive
(поскольку оно было удалено или never set) не будет отображаться при итерации с курсором.Вуаля, Aбулев индекс .
Примечания к производительности
Открытие курсора на индексе, как это было сделано в примере, приведенном здесь, обеспечит хорошую производительность. Разница в производительности не заметна при небольших данных, но она чрезвычайно заметна при хранении большего количества объектов. Нет необходимости использовать какую-то стороннюю библиотеку для выполнения "булевых индексов". Это обыденное и простая функция, которую вы можете сделать самостоятельно. Вы должны стараться максимально использовать собственные функциональные возможности.
Логические свойства
Описывают исключительное состояние (активное / неактивное), "включено/выключено", "включено/выключено", "Да/нет". Вы можете использовать эти пары значений вместо логических в модели данных JS для удобства чтения. Также эта тактика позволяет добавлять другие состояния ('NotSet', для ситуации, если что-то не было настроено в объекте и т.д.)...