【问题标题】:How to match a word and sort by an order with a minimum in pouch db?如何匹配一个单词并按 pouch db 中最小的顺序排序?
【发布时间】:2015-06-29 18:31:05
【问题描述】:

我在尝试学习 pouch db 时尝试创建联系人应用程序。我希望按联系人的frequency 对查询进行排序。 frequency 是一个简单的整数,每次联系该人时都会递增。

到目前为止,我已经尝试构建我的视图,例如

by_frequency: function(doc){
   emit(doc.displayName.toLowerCase(), doc.frequency);
}

然后通过查询

{
   startkey: [query],
   endkey:   [query + '\uffff', {}],
   descending: true
}

但答案不是我需要的,事实上它甚至没有按频率排序

有没有可能做类似的事情

{
      startkey: [query, 1],
      endkey: [query + '\uffff', {}]
}

我还想过使用 startkey: 1 按频率对所有文档进行排序,然后过滤它们的名称,但感觉不对……或者这是唯一的方法吗?

在 SQL 中是这样的

"SELECT * FROM contacts WHERE name LIKE "some%" order by frequency desc"

【问题讨论】:

  • 2 杯咖啡,我意识到我在做什么,废话

标签: couchdb pouchdb


【解决方案1】:

无法将前缀搜索与整数搜索结合起来。但是您可以先进行前缀搜索,然后在内存中进行排序:

by_frequency: function(doc){
   emit(doc.displayName.toLowerCase());
}

然后用例如查询:

{
  startkey: "some",
  endkey: "some\uffff",
  include_docs: true
}

我觉得有必要补充一点,即使是 SQL 数据库也会做同样的事情。它只是在后台透明地执行它,而在 PouchDB/CouchDB 中,它更加明确。尝试在 MySQL 中对您的查询进行 EXPLAIN,您会明白我的意思 :)

【讨论】:

  • 我的想法,谢谢 :-) 现在我有 2 个单独的索引,一个专门用于频率,一个专门用于名称。我不喜欢必须将所有项目加载到内存中。通过将整数转换为字符串来复合查询不是更好吗? emit([doc.frequency, doc.displayName.toLowerCase()]) 之类的,有什么问题?
  • PS 我没有反对 Pouch 如果可以以某种方式缓存它们,我会避免在内存操作中进行操作,因为我的目标是针对内存受限的移动设备,因此查询在桌面上返回 194ms chrome 可能在低端手机上无法使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
相关资源
最近更新 更多