Напишите несколько, где условие, используя Dexie.js - PullRequest
0 голосов
/ 22 сентября 2019

Как я могу написать условие where, подобное следующему, используя Dexie.js?

field1=0 AND field2!='test' AND field3 IN(1,2,3,4)

Я пробовал это, но получил ошибку ....

.where('field1').equals(0).and('field2').notEquals('test').and('field3').anyOf([1,2,3,4]).toArray()

Iпредположим, потому что метод ".and" работает только с функцией.Но если мне нужно написать кратное условие where с различными типами условий (например: equals, notEquals, anyOf) ... Как я могу это сделать?

Я ценю вашу поддержку,заранее спасибо

1 Ответ

0 голосов
/ 25 сентября 2019

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 ().

...