Булевы нельзя индексировать в Dexie. Смотрите документацию: https://dexie.org/docs/Indexable-Type
Возможны следующие типы javascript для индексации:
- строка
- номер
- Дата
- Массивы строк, чисел, дат или их сочетаний.
- ArrayBuffer (только IndexedDB 2.0)
- Типизированные массивы (только IndexedDB 2.0)
Обратите внимание, что все другие типы не индексируются, в том числе:
- булево
- не определено
- Object
- 1032 * нуль *
В данный момент я пытаюсь найти хорошую альтернативу этому, но простым решением будет использование числа с 0 = false и 1 = true. Это дает то преимущество, что вы все еще можете полагаться на индекс базы данных для выполнения вашего запроса:
const db = new Dexie('ToDo_DB');
db.version(1).stores({
list: '++id, task, dateTime, done'
});
db.list.clear();
db.list.add({task: "1 task", dateTime: Date.now(), done: 1});
db.list.add({task: "2 task", dateTime: Date.now(), done: 0});
db.list.add({task: "3 task", dateTime: Date.now(), done: 1});
db.list.add({task: "4 task", dateTime: Date.now(), done: 0});
db.list.where('done').equals(0).each(function(item) {
console.log('Found: ' + item.task + ' with date ' + item.dateTime);
});
Если у вас мало данных в вашем магазине и вам не нужно индексировать, вы можете использовать свои собственные функции filter () , например:
const db = new Dexie('ToDo_DB');
db.version(1).stores({
list: '++id, task, dateTime, done'
});
db.list.clear();
db.list.add({task: "1 task", dateTime: Date.now(), done: true});
db.list.add({task: "2 task", dateTime: Date.now(), done: false});
db.list.add({task: "3 task", dateTime: Date.now(), done: true});
db.list.add({task: "4 task", dateTime: Date.now(), done: false});
db.list.filter(e => e.done === false).each(function(item) {
console.log('Found: ' + item.task + ' with date ' + item.dateTime);
});
Если у вас есть большие объекты (с каплями) или много записей, это, вероятно, не очень эффективный вариант. Вместо этого вы должны использовать индекс.