使用 Dexie.js 写入多个 where 条件

Write multiple where condition using Dexie.js

如何使用 Dexie.js 编写如下所示的 where 条件?

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

我想是因为 ".and" 方法只适用于一个函数。 但是如果我必须写一个具有不同类型条件的多个 where 条件(例如:equalsnotEqualsanyOf)...我该怎么做?

感谢您的支持, 提前致谢

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