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

Enr*_*oft 4 javascript indexeddb dexie

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

field1=0 AND field2!='test' AND field3 IN(1,2,3,4)
Run Code Online (Sandbox Code Playgroud)

我试过这个,但我得到了一个错误......

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

我想是因为该".and"方法仅适用于函数。但是如果我必须写一个多地方与不同类型的条件条件(如:equalsnotEqualsanyOf)...我怎么能这样做?

感谢您的支持,提前致谢

Enr*_*oft 6

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");
}
Run Code Online (Sandbox Code Playgroud)

上面的逻辑是这样的:

field1 是一个等于运算符 - 如果我们在复合索引 ('[field1+field3]') 中有它,它可以与另一个条件结合使用 field2 是一个 noteEqual,它通常从没有使用索引的任何好处 - 所以过滤它使用 and() 方法。field3 是一个 anyOf()。使用复合索引并执行单个 anyOf()。

  • 长久以来“易于使用”的承诺。>> Dexie 没有查询计划,因此您需要自己执行该逻辑。 (2认同)