【问题标题】:PouchDb fetch all documents by Id matching regexPouchDb 通过 Id 匹配正则表达式获取所有文档
【发布时间】:2019-01-25 21:17:07
【问题描述】:

我想获取所有 id 与正则表达式匹配的文档。

例如,我有以下文档 ID:

p0
p0/e0
p1
p1/e0

我怎样才能只得到 p0 和 p1 ?正则表达式是 /^p[0-9]+$/

目前我可以执行两个请求,但我只想使用一个:

This.db.allDocs({
    include_docs: false
}).then(function(result){

    // Find all ids matching /^p[0-9]+$/
    var iDoc = result.rows.length;
    while(iDoc--){
        if(result.rows[iDoc].id.match(/^p[0-9]+$/)){
            projectsIds.push(result.rows[iDoc].id);
        }
    }

    // Get all documents with ids matching /^p[0-9]+$/
    This.db.allDocs({
        include_docs: true,
        keys: projectsIds
    }).then(function(result) {
        var iProject = result.rows.length;
        var docs = [];
        while (iProject--) {
            docs[iProject] = result.rows[iProject].doc;
        }
        projects.resolve(docs);

    });

});

【问题讨论】:

  • 你使用什么样的正则表达式?你能提供更多信息

标签: javascript pouchdb


【解决方案1】:

这可以通过前缀获取文档,对于 例子

localDB.allDocs({
            include_docs: true,
            startkey: "p0",
            endkey: "p0\uffff"
        },...);

以上代码为您提供了_id以p0开头的所有文档。

参考链接 https://github.com/nolanlawson/pouchdb-quick-search#autosuggestions-and-prefix-search

【讨论】:

  • 这段代码会得到“p0”和“p0/e0”,这不是我想要的。
  • 您可以使用过滤器功能,并且可以定义您的逻辑
  • 我知道用于复制的过滤器功能,但是如何使用它来检索文档?我是否需要使用 include_docs: false 获取所有文档 ID,对结果应用我的过滤器,然后使用键匹配选项执行第二个请求?
  • 您可以使用 allDocs 函数和 keys 选项,它接受字符串数组以单次获取指定的文档。
  • 我的意思是完全匹配这个正则表达式:/^p[0-9]+$/
【解决方案2】:

您需要使用 allDocs() 获取所有文档,然后使用 JavaScript 在内存中进行过滤。

这需要将整个数据库读入内存,但 PouchDB 无法在正则表达式上建立索引,所以这是你必须做的!否则,您可以设计自己的 ID,以便更容易按照其他评论者的描述进行前缀搜索。

【讨论】:

  • 好的,谢谢,这正是我现在正在做的事情。我是否必须验证这种很好但不能解决我的问题的答案?
  • 很抱歉您觉得它不能解决您的问题。实际上,大多数数据库不允许您对正则表达式进行索引,因此实际上当您进行“正则表达式”搜索(或 SQL 中的LIKE 查询)时,实际上发生的情况是数据库正在执行全表扫描然后返回结果,你可以自己做同样糟糕的表现。 :) 我知道的唯一可以索引此类“模糊”查询的数据库是 Lucene/Solr:blog.mikemccandless.com/2011/03/…
【解决方案3】:

几年后,看起来pouchdb-find 插件可能有所帮助(我认为由上面的@nlawson 编写)。这是 Pouch 文档谈论使用它进行查询...https://pouchdb.com/api.html#query_index

你会怎么做:

async test()
  let result = await This.db.find({
    selector: {_id: {$regex: '^p[0-9]+$'}}
  });
  let docs = result.rows.map( row => row.doc )
  console.dir(docs)
}

(我将其设为异步,这样您就不必为回调而烦恼)

您可以在 pouchdb-find 插件的site 上亲自尝试一下。

虽然性能可能很糟糕,但我还没有尝试过。 @nlawson 似乎认为索引上的正则表达式无法快速完成,他肯定比大多数人都知道。

编辑:我刚刚检查了上面提到的 Pouch 文档,并且在查找过程中肯定使用了索引,因此性能可能还可以。

【讨论】:

    猜你喜欢
    • 2017-06-26
    • 2013-05-09
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多