如何使用 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 条件(例如:
equals
, notEquals
, anyOf
)......我该怎么做?感谢您的支持,
提前致谢
最佳答案
Collection.and() 与 Collection.filter() 相同,并接受 JS 回调。
原因是一个索引只能用于一个标准。典型的 SQL 数据库具有相同的限制,但它具有一些智能策略(查询计划),试图找出用于索引查找的字段以及用于手动过滤结果的字段。 Dexie 没有查询计划,因此您需要自己执行该逻辑。
对于将 equals 过滤器与另一个过滤器组合的情况,复合索引也可用于获得更有效的 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()。
关于javascript - 使用 Dexie.js 编写多个 where 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58050422/