Индексированные базы данных - индекса логическое


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

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

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

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

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

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

Я использую Chrome 25 канарейка

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

3 12

3 ответа:

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

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

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

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

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

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

Пример

Например, предположим, что у вас есть хранилище объектов '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', для ситуации, если что-то не было настроено в объекте и т.д.)...