使用 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 条件(例如:equals
、notEquals
、anyOf
)...我该怎么做?
感谢您的支持,
提前致谢
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()。
如何使用 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 没有查询计划,因此您需要自己执行该逻辑。
对于将等式过滤器与另一个过滤器结合使用的情况,复合索引也可用于获得更高效的 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()。