Collection.and () идентичен Collection.filter () и принимает обратный вызов JS.
Причина в том, что индекс может использоваться только для одного критерия.Типичная база данных SQL имеет то же ограничение, но имеет некоторые интеллектуальные стратегии (план запроса), которые пытаются выяснить, какое поле использовать для поиска индекса, а какие - для ручной фильтрации результата.У Dexie нет планов запросов, поэтому вам нужно выполнить эту логику самостоятельно.
В случаях, когда вы комбинируете фильтр равенства с другим фильтром, составной индекс также можно использовать для получения более эффективных запросов AND.
Таким образом, в качестве примера мы можем взять ваш точный пример и перевести его наиболее оптимальным способом, используя запросы dexie:
const db = new Dexie("multipleCriteriasSample");
db.version(1).stores({
someTable: 'id, [field1+field3]'
});
function doTheQuery() {
return db.someTable.where('[field1+field3]').anyOf([
[0, 1],
[0, 2],
[0, 3],
[0, 4]
]).and(item => item.field2 !== "test");
}
Логика, описанная выше, такова:
field1является оператором равенства, который позволяет комбинировать его с другими критериями, если он есть в составном индексе ('[field1 + field3]'). field2 - это notEqual, который, как правило, никогда не получает выгоды от использования индекса - поэтому отфильтруйте его, используяметод and ().field3 - это anyOf ().Используйте составной индекс и сделайте один anyOf ().