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

标签 javascript indexeddb dexie

如何使用 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 没有查询计划,因此您需要自己执行该逻辑。

对于将 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/

相关文章:

indexeddb - Dexie:如何跨多个浏览器引用一个 dexie 数据库?

javascript - 如何将现有 Dexie 数据库迁移到新的 Dexie 数据库或如何重命名 Dexie 数据库?

javascript - React-Router 中的 useloaderdata() 是否解析了 Promise?

firefox - 为什么我在 Firefox devtools 中看不到我的 Indexeddb?

javascript - 来自 getScript 的 jQuery setInterval

javascript - 如何实现由 indexeddb 或 localstorage 支持的基于浏览器的队列?

javascript - 导出和导入 IndexedDB 数据

vue.js - Dexie.js table.name 不起作用,即使该表位于 tables 属性下

javascript - IE,XDomainRequest 并不总是有效

javascript - JavaScript 中的 thenable 对象如何被拒绝?