Dexie JS - 结合条件过滤器和文本搜索

Posted

技术标签:

【中文标题】Dexie JS - 结合条件过滤器和文本搜索【英文标题】:Dexie JS - Combining Condition Filters and Text Search 【发布时间】:2021-03-23 04:36:35 【问题描述】:

我已经阅读了各种关于在 Dexie 查询中组合 andor 语句的帖子和示例,但我仍然感到困惑。

我的tasks 查询首先根据应用的 UI 状态过滤掉某些属性。例如,我想按项目查看任务,以及它们是完成还是删除。这些条件都是在我的数据库初始化的时候索引的。

var where = null

switch(selectedProject)
  case 'inbox': 
    where =  project: '', completed: filterCompleted, deleted: 0 
    break
  case 'my-tasks':
    where =  assignee: sessionStorage.userId, completed: filterCompleted, deleted: 0 
    break
  default:
    where =  project: selectedProject, completed: filterCompleted, deleted: 0 


//Ready to go...
tasks = await db.tasks.where(where).sortBy('order')

除了这些查看不同任务状态的方法外,我还有一个文本搜索字段,用于过滤列表中的剩余任务。如果我省略上述条件 where 条件,我可以使用以下 很好地工作:

//searchText is the user's input text in the search field
let searchTerms = searchText.split(' ')

tasks = await db.tasks
  .where('name').anyOfIgnoreCase(searchTerms)
  .or('name').startsWithIgnoreCase(searchText)
  .or('notesPlain').anyOfIgnoreCase(searchTerms)
  .sortBy('order')

我苦苦挣扎的地方是如何结合初始 UI 状态的 where 子句和上述文本搜索。我已经尝试将其附加到上面的代码中,但它不起作用:

...
.sortBy('order')
.filter(function(task) 
  return task.project == selectedProject && task.completed == filterCompleted && task.deleted == 0
)

关于如何解决这个问题的任何想法?

【问题讨论】:

【参考方案1】:

嘿,你可以这样做:

 tasks = (await db.tasks
  .where('name').anyOfIgnoreCase(searchTerms)
  .or('name').startsWithIgnoreCase(searchText)
  .or('notesPlain').anyOfIgnoreCase(searchTerms)
  .sortBy('order'))
.filter(function(task) 
  return task.project == selectedProject && task.completed == filterCompleted && task.deleted == 0
)

sortBy 返回一个 Promise,所以你需要用 await 包装来获取 Collection 对象。

【讨论】:

以上是关于Dexie JS - 结合条件过滤器和文本搜索的主要内容,如果未能解决你的问题,请参考以下文章

如何在vue js的过滤器搜索中添加大于等于的条件

计算与搜索条件匹配的所有行

使用全文搜索和其他条件搜索1300万条记录

grep文本查看工具及正则表达式

使用条件实现搜索过滤器

Extjs - 高级搜索表单